반응형
https://www.acmicpc.net/problem/2193
본 문제는 0과 1로만 이루어진 수 중, 0으로 시작하지 않고, 1이 두 번 연속으로 나타나지 않는 수를 구하는 문제다. 큰 문제를 작은 문제에서 구할 수 있기 때문에 DP로 풀었다. i자리 수 중 0으로 끝나는 수는 i-1자리 수 중 0으로 끝나는 수와 1로 끝나는 수의 합으로 이루어 진다. 따라서, d[i][0] = d[i-1][0] + d[i-1][1]의 점화식이 정의되고 d[i][1] = d[i-1][0]경우를 따로 계산하면 된다.
- d[i][0] = d[i-1][0] + d[i-1][1]
- d[i][1] = d[i-1][0]
- d[n][1] + d[n][0]의 결과 출력
Top-down
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <cstdio>
#include <cstring>
using namespace std;
long long d[91][2];
long long cal(int n, int i) {
if (n == 1) {
if (i == 0) return 0;
else return 1;
}
if (d[n][i] != -1) return d[n][i];
if (i == 0) d[n][i] = cal(n-1, 0) + cal(n-1, 1);
if (i == 1) d[n][i] = cal(n-1, 0);
return d[n][i];
}
int main() {
int n;
scanf("%d", &n);
memset(d, -1, sizeof(d));
long long ans = cal(n, 0) + cal(n, 1);
printf("%lld", ans);
}
|
cs |
Bottom-up
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <cstdio>
using namespace std;
long long d[91][2];
int main() {
int n;
scanf("%d", &n);
d[1][0] = 0;
d[1][1] = 1;
for (int i = 2; i <= n; i++) {
d[i][0] = d[i-1][0] + d[i-1][1];
d[i][1] = d[i-1][0];
}
printf("%lld", d[n][0] + d[n][1]);
}
|
cs |
반응형
'백준' 카테고리의 다른 글
[백준 14002] 가장 긴 증가하는 부분 수열 4, C++ (0) | 2020.01.12 |
---|---|
[백준 11053] 가장 긴 증가하는 부분 수열, C++ (0) | 2020.01.12 |
[백준] 10844 - 쉬운 계단 수, C++ (0) | 2020.01.11 |
[백준 15990] 1, 2, 3 더하기 5, C++ (0) | 2020.01.11 |
[백준 11052] 카드 구매하기, C++ (0) | 2020.01.11 |
댓글