DP
2026-08-20 13:57:56
发布于:广东
1阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 1e5 + 10;
ll n;
ll a[N], dp[N];
string s;
int main() {
cin >> n >> s;
s = " " + s; // 下标从1开始
for (ll i = 1; i <= n; i++) {
cin >> a[i];
}
// dp[i]:前 i 个字符划分的最大价值
dp[0] = 0;
for (ll i = 1; i <= n; i++) {
dp[i] = -1e18;
ll mask = 0; // 位运算记录出现过的字母
// 从 i 向左扩展,找所有合法子串 s[j..i]
for (ll j = i; j >= 1; j--) {
ll bit = 1 << (s[j] - 'a');
if (mask & bit) break; // 字母重复,停止扩展
mask |= bit;
ll len = i - j + 1;
dp[i] = max(dp[i], dp[j - 1] + a[len]);
}
}
cout << dp[n] << endl;
return 0;
}
这里空空如也


有帮助,赞一个