※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 13906번 문제인 대문자이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/13906
13906번: 대문자
만들 수 있는 대문자로만 이루어진 문장의 수를 1,000,000,007로 나눈 나머지를 출력한다.
www.acmicpc.net
dp[i]를 주어진 문자열의 i번째 문자를 마지막 문자로 남겨 생성할 수 있는 대문자 문장의 경우의 수로 정의하자. 위와 같은 문장은 i번째 문자를 대문자로 바꾼 문자로 끝나고, 해당 알파벳을 지우면 (1) 빈 문자열("")이 되거나 (2) 각 대문자 알파벳('A', ..., 'Z')로 끝나는 문자열이 됨을 관찰하자.
위의 관찰을 이용해 점화식을 세우고 문제를 해결하자.
아래는 제출한 소스코드이다.
#define MOD 1000000007
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
typedef long long ll;
string s; int slen;
ll dp[1000]; // [i]: i번째 idx로 끝나는 문자열 개수
int visited[128];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> s;
slen = s.length();
for (int i = 0; i < slen; i++) {
memset(visited, 0, sizeof(visited));
char& c = s[i];
int cnt = 1;
bool chk = 0;
for (int j = i - 1; j > -1; j--) {
if (chk) {
if (!visited[s[j]]) {
visited[s[j]] = 1, dp[i] += dp[j];
}
}
else {
if (s[j] == c) cnt++;
if (cnt == 3) chk = 1, dp[i] = 1;
}
}
dp[i] %= MOD;
}
ll ans = 0;
memset(visited, 0, sizeof(visited));
for (int i = slen - 1; i > -1; i--) {
if (!visited[s[i]]) {
visited[s[i]] = 1, ans += dp[i];
}
}
cout << ans % MOD;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 2003 // C++] 수들의 합 2 (0) | 2023.04.01 |
---|---|
[BOJ 13915 // C++] 현수의 열기구 교실 (0) | 2023.03.31 |
[BOJ 13905 // C++] 세부 (0) | 2023.03.29 |
[BOJ 13902 // C++] 개업 2 (0) | 2023.03.28 |
[BOJ 13901 // C++] 로봇 (0) | 2023.03.27 |