반응형
문제링크:www.acmicpc.net/problem/2698
전형적인 dp문제입니다.
결과를 도출할때 2가지로 나누어 생각했습니다.
- 끝이 0일때,
- 끝이 1일때
만약 n=4, k=1일때, 경우의수는
1100
0110
0011
1101
1011
이렇게 5가지 입니다.
즉,
i는 n, j는 k 값일때
각각
dp[idp[i][j][0] = dp[i - 1][j][0] + dp[i - 1][j][1]
dp[i][j][1] = dp[i - 1][j][0] + dp[i - 1][j - 1][1]
아래는 정답코드입니다.
#include <iostream>
using namespace std;
int t,n, k;
int dp[101][101][2] = { 0, };
int main() {
cin >> t;
dp[1][0][0] = 1; //n k 마지막수가 0인지 1인지
dp[1][0][1] = 1;
for (int i = 2; i <=100; i++) {
for (int j = 0; j < i; j++) {
dp[i][j][0] = dp[i - 1][j][0] + dp[i - 1][j][1];
dp[i][j][1] = dp[i - 1][j][0] + dp[i - 1][j - 1][1];
}
}
while (t--) {
cin >> n >> k;
cout << dp[n][k][0] + dp[n][k][1] << "\n";
}
}
반응형
'알고리즘 > DP' 카테고리의 다른 글
[백준] 1949-우수 마을(C++) (2) | 2021.02.15 |
---|---|
[백준] 2666-벽장문의 이동(C++) (0) | 2021.01.08 |
[백준] 9251-LCS(C++) (0) | 2021.01.06 |
[백준] 9252-LCS 2(C++) (0) | 2021.01.05 |
[백준] 5502-팰린드롬(C++) (0) | 2021.01.05 |