반응형
https://www.acmicpc.net/problem/2011
2011번: 암호코드
나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다.
www.acmicpc.net
[ 문제풀이 ]
1. i와 i - 1의 수를 조합하여 27이상이고 1의 자리가 0이 아닐 때 또는 10의 자리가 0이고 1의 자리가 0이 아닐 때
dp [ 1 ][ i ] = (dp [ 1 ][ i - 1 ] % M + dp [ 2 ][ i - 1 ] % M) % M;
2. 10, 20일 때
dp [ 2 ][ i ] = (dp [ 1 ][ i - 2 ] % M + dp [ 2 ][ i - 2 ] % M) % M;
3. 나머지의 경우
dp [ 1 ][ i ] = (dp [ 1 ][ i - 1 ] % M + dp [ 2 ][ i - 1 ] % M) % M;
dp [ 2 ][ i ] = (dp [ 1 ][ i - 2 ] % M + dp [ 2 ][ i - 2 ] % M) % M;
위의 점화식을 이용하여 마지막에
(dp [ 1 ][ size - 1 ] % M + dp [ 2 ][ size - 1 ] % M) % M을 출력하면 됩니다.
[ 소스코드 ]
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include<iostream> #include<string> #define M 1000000 using namespace std; string str; int dp[3][5001]; int main() { cin >> str; if (str[0] == '0') { printf("%d", 0); return 0; } for (int i = 0; i < 2; i++) { //초기 세팅 if (str[i] != '0') dp[1][i] = 1; } if ((str[0] - '0') * 10 + str[1] - '0' > 0 && (str[0] - '0') * 10 + str[1] - '0' < 27) { dp[2][1] = 1; } for (int i = 2; i < str.size(); i++) { if (((str[i - 1] - '0') * 10 + str[i] - '0' > 26 && str[i] != '0') || (str[i-1] == '0' && str[i] > '0')) { dp[1][i] = (dp[1][i - 1] % M + dp[2][i - 1] % M) % M; } // 27이상이고 1의 자리가 0이 아닐 때 또는 10의 자리가 0이고 1의 자리가 0이 아닐 때 else if (str[i] == '0') { if (str[i - 1] != '1' && str[i - 1] != '2') { //10, 20이 아닐 때 printf("%d", 0); return 0; } else { //10, 20일 때 dp[2][i] = (dp[1][i - 2] % M + dp[2][i - 2] % M) % M; } } else { //11이상 26이하일 때 dp[1][i] = (dp[1][i - 1] % M + dp[2][i - 1] % M) % M; dp[2][i] = (dp[1][i - 2] % M + dp[2][i - 2] % M) % M; } } printf("%d", (dp[1][str.size() - 1] % M + dp[2][str.size() - 1] % M) % M); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 5582번 - 공통 부분 문자열 (C++) (0) | 2022.10.22 |
---|---|
[ 백준 ] 2225번 - 합분해 (C++) (0) | 2022.10.21 |
[ 백준 ] 2631번 - 줄세우기 (C++) (0) | 2022.10.19 |
[ 백준 ] 2636번 - 치즈 (C++) (0) | 2022.10.16 |
[ 백준 ] 3954번 - Brainf**k 인터프리터 (C++) (0) | 2022.10.15 |