[状压DP]P1278 单词游戏 题解
数据范围这么小只有两种可能,要不随机化要不状压。
随机化显然不对,那就是状压了。
转移方程显而易见,记录一下选了哪些单词和以哪个单词结尾即可。
#include <bits/stdc++.h>
constexpr int N = 17;
using namespace std;
int ans , n , l[N] , dp[1 << N][6];
char s[N][105];
unordered_map<char , int> mp;
int main() {
cin >> n;
mp['A'] = 1 , mp['E'] = 2 , mp['I'] = 3 , mp['O'] = 4 , mp['U'] = 5;
for(register int i = 1; i <= n; ++i) {
cin >> s[i]; l[i] = strlen(s[i]);
}
for(register int i = 0; i < (1 << n); ++i) {
for(register int j = 1; (1 << j - 1) <= i; ++j) {
if(i & (1 << j - 1)) {
dp[i][mp[s[j][l[j] - 1]]] = max(dp[i][mp[s[j][l[j] - 1]]] , dp[i ^ (1 << j - 1)][mp[s[j][0]]] + l[j]);
}
}
}
for(register int i = 1; i <= 5; ++i) {
ans = max(ans , dp[(1 << n) - 1][i]);
}
cout << ans;
return 0;
}