好难想啊! 不过看到 n <= 100 应该想到可能状态定义要 n^3, 然后复杂度是 n^4 的

CF1107E Vasya and Binary String [DP]_i++ 表示区间 l -- r, r 左边有连续的k个与r相同的答案

 然后我们枚举把 l -- r 从中间断开, 或者直接把 r 以及后面k个消掉

CF1107E Vasya and Binary String [DP]_i++_02

CF1107E Vasya and Binary String [DP]_#include_03

#include<bits/stdc++.h>
#define N 105
using namespace std;
typedef long long ll;
ll f[N][N][N]; int n, sum[N], v[N]; char s[N];
int main(){
scanf("%d%s", &n, s+1);
for(int i=1; i<=n; i++){
scanf("%d", &v[i]);
for(int j=1; j<i; j++) v[i] = max(v[i], v[i-j] + v[j]);
}
for(int i=1; i<=n; i++){
for(int j=i+1; j<=n; j++) if(s[j] == s[i]) sum[i]++;
}
for(int l=n; l>=1; l--){
for(int r=l; r<=n; r++){
for(int p=l; p<r; p++){
if(s[p] == s[r]){
for(int k=0; k<=sum[r]; k++){
f[l][r][k] = max(f[l][p][k+1] + f[p+1][r-1][0], f[l][r][k]);
}
}
}
for(int k=0; k<=sum[r]; k++){
f[l][r][k] = max(f[l][r][k], f[l][r-1][0] + v[k+1]);
}
}
} printf("%lld", f[1][n][0]);
}