문제링크
https://www.acmicpc.net/problem/2011
2011번: 암호코드
나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다.
www.acmicpc.net
풀이
- 숫자 두개 또는 하나를 알파벳 하나로 해석할 수 있다.
- $dp[cur][l]$ : cur 위치에서 l 길이를 한 글자로 볼 때 경우의 수
코드
#include <bits/stdc++.h>
using namespace std;
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s;
cin >> s;
vector<vector<int> > dp(s.size(), vector<int> (3, -1));
function<int(int, int)> f = [&](int cur, int l) {
if (cur > s.size()) return 0;
auto& ret = dp[cur][l];
if (ret != -1) return ret;
if (s[cur] == '0') return ret = 0;
auto num = stoi(s.substr(cur, l));
if (num > 26 || num <= 0) return ret = 0;
if (cur + l == s.size()) return ret = 1;
return ret = (f(cur + l, 1) + f(cur + l, 2)) % 1000000;
};
cout << (f(0, 1) + f(0, 2)) % 1000000 << '\n';
}
728x90
'PS > BOJ' 카테고리의 다른 글
백준 1557번: 제곱 ㄴㄴ (0) | 2022.07.05 |
---|---|
백준 1102번: 발전소 (0) | 2022.07.02 |
백준 13546번: 수열과 쿼리 4 (0) | 2022.03.08 |
백준 6171번: 땅따먹기 (0) | 2022.03.08 |
백준 3295번: 단방향 링크 네트워크 (0) | 2022.03.07 |