[状压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;
}
posted @ 2025-06-01 00:42  「癔症」  阅读(5)  评论(0)    收藏  举报