https://www.acmicpc.net/problem/2011
2011번: 암호코드
나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다.
www.acmicpc.net
[난이도] Gold5
[유형] DP
[풀이]
DP[i] : s가 길이 n인 암호 문자열일 때, s[i..n-1] 로 만들 수 있는 해석의 총 개수.
#include <string>
#include <iostream>
#include <cstring>
using namespace std;
int dp[5001];
string s;
int sol(int n){
if(n>=s.size()) return 1;
int& ret = dp[n];
if(ret!=-1) return ret;
if(s[n]=='0') return 0;
ret=sol(n+1);
if(n+1<s.size()){
int k = (s[n]-'0')*10+(s[n+1]-'0');
if(k<27) ret=(ret+sol(n+2))%1000000;
}
return ret;
}
int main(){
cin >> s;
memset(dp,-1,sizeof(dp));
cout << sol(0);
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold5/2011.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold5] 1106 : 호텔 (C++) (0) | 2022.05.29 |
---|---|
[BOJ/백준][Gold5] 19940 : 피자 오븐 (C++) (0) | 2022.05.13 |
[BOJ/백준][Gold1] 1509 : 팰린드롬 분할 (C++) (0) | 2022.05.13 |
[BOJ/백준][Gold5] 19942 : 다이어트 (C++) (1) | 2022.05.13 |
[BOJ/백준][Platinum5] 2568 : 전깃줄 - 2 (C++) (0) | 2022.05.13 |