비트마스크를 활용한 DP문제다.
아까 풀어봤기 때문에 어려움없이 쉽게 풀 수 있었다.
다만 여기선 무조건 있어야 되기 때문에 and 연산자를 사용했다.
#define MOD 1000000007
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
long long DP[10001][16];
int main(int argc, char** argv)
{
int test_case;
int T;
cin >> T;
for (test_case = 1; test_case <= T; ++test_case)
{
string in; cin >> in;
int len = in.length();
memset(DP, 0, sizeof(DP));
for (int i = 0; i < len; i++)
{
int admin = 1 << (in[i] - 'A');
for (int j = 1; j < 16; j++)
{
if (i == 0)
{
if ((j & admin) != 0 && (j & 1) != 0)
{
DP[i][j] = 1;
}
}
else
if (DP[i - 1][j] != 0)
for (int k = 1; k < 16; k++)
if ((k & j) != 0 && (k & admin) != 0)
{
DP[i][k] += DP[i - 1][j];
DP[i][k] %= MOD;
}
}
}
long long out = 0;
for (int i = 1; i < 16; i++)
{
out += DP[len - 1][i];
out %= MOD;
}
cout << '#' << test_case << ' ' << out << '\n';
}
return 0;
}
'Coding_Test 연습 > SWEA' 카테고리의 다른 글
[SWEA] (C++) D4 1494 사랑의 카운슬러 (0) | 2022.04.13 |
---|---|
[SWEA] (C++) D4 6719 성수의 프로그래밍 강좌 시청 (0) | 2022.04.12 |
[SWEA] (C++) D4 1868 파핑파핑 지뢰찾기 (0) | 2022.04.12 |
[SWEA] (C++) D4 7393 대규의 팬덤활동 (0) | 2022.04.12 |
[SWEA] (C++) D4 1486. 장훈이의 높은 선반 (0) | 2022.04.12 |