DP?
- Dynamic Programming
- 문제를 해결할 때, 큰 문제를 작은 문제로 분할하여 푸는 방법.
- 분할 정복 알고리즘과 유사.
- DP는 계산했던 결과를 저장하여 불필요한 연산 제외.
- 크게 Top-Down, Button-Up 방법 존재.
- 메모이제이션 (Memoization) : 계산한 값 저장하는 것
특성
- Overlapping Subproblems : 큰 문제 --> 작은 문제 --> ...
- OPtimal Structure : 작은 문제의 결과값(return) --> 큰 문제의 결과값 --> ...
문제풀이
#include <stdio.h>
int main(){
int n;
int a=0,b=1,result=0;
scanf("%d", &n);
if(n==1) {
printf("1");
return 0;
}
for(int i=1;i<n;i++){
result=a+b;
a=b;
b=result;
}
printf("%d" , result);
return 0;
}
int FTP(int n) {
if(fibo[n] == -1)
fibo[n] = FTD(n-1) + FTD(n-2);
return fibo[n];
}
//Top-Down
int FBU(int n) {
for (int i=2;i<=n;i++)
fibo[i] = fibo[i-1] + fibo[i-2];
return fibo[n];
}
//Bottom-Up
BOJ 2747 피보나치 수
#include <stdio.h>
#include <algorithm>
using namespace std;
long long p[1001];
long long waterrr(int n){
if(p[n] == -1){
p[n] = waterrr(n-2) + waterrr(n-3);
}
return p[n];
}
int main(){
int c, n;
scanf("%d", &c);
fill(&p[0], &p[1000], -1);
p[1]=1; p[2]=1; p[3]=1;
for(int i=0;i<c;i++){
scanf("%d", &n);
printf("%lld\n", waterrr(n));
}
}
//점화식 : F(n) = F(n-2) + F(n-3)
BOJ 9461 파도반 수열
#include <stdio.h>
#include <algorithm>
using namespace std;
int x[20];
int makeOTT(int n){
if(x[n] == -1){
x[n] = makeOTT(n-1)+makeOTT(n-2)+makeOTT(n-3);
}
return x[n];
}
int main(){
int c, n;
fill(x, &x[11], -1);
x[1]=1; x[2]=2; x[3]=4;
scanf("%d", &c);
for(int i=0;i<c;i++){
scanf("%d", &n);
printf("%d\n", makeOTT(n));
}
return 0;
}
//점화식 : F(n) = F(n-1)+F(n-2)+F(n-3)
BOJ 9095 1,2,3 더하기
#include <stdio.h>
#include <algorithm>
#define MOD 10007
using namespace std;
int x[1005];
int tiling(int n){
if(x[n] == -1){
x[n] = tiling(n-1) + tiling(n-2);
}
return x[n]%MOD;
}
int main(){
int n;
scanf("%d", &n);
fill(x, &x[1001], -1);
x[1] = 1, x[2] = 2;
printf("%d\n", tiling(n));
}
//점화식 : F(n) = F(n-1)+F(n-2)
BOJ 11726 2xn 타일링
'Development' 카테고리의 다른 글
CodeUp 기초100제 (바둑알 십자뒤집기) (0) | 2020.10.18 |
---|---|
Win32 API 정리 (0) | 2019.03.06 |
기초 자료구조 정리(리스트, 그래프, 트리) (0) | 2019.01.14 |
알고리즘 정렬 정리 (0) | 2019.01.09 |
다익스트라 알고리즘 (0) | 2018.12.04 |