https://codeforces.com/contest/1107/problem/E
区间dp+记忆化搜索
dp[l][r][k]代表从l到r的区间内,当这段区间之前的串中有pre个和s[l]相同字符时,操作值的大小。
每次首先考虑
(1)把第一个字符和之前的串一起消掉
(2)把这段之后的剩余子串放到搜索中处理
dp[l][r][pre]=max(dp[l][r][k],dp[l+1][r][0]+a[pre]);
(3)然后在[l+1,r]中找到一个i,s[i]==s[l+1],这样可以把前串和[i,r]合并
dp[l][r][pre]=max(dp[l][r][pre],dp[l+1][i-1][0]+dp[i][r][pre+1]);
大概是这样吧。。。
#include <bits/stdc++.h>
using namespace std;
const int maxn=200;
typedef long long ll;
string s;
ll a[maxn]={0},dp[maxn][maxn][maxn];
ll dfs(int l,int r,int pre)
{
if(l>r)return 0;
if(l==r) return a[pre];
if(dp[l][r][pre]) return dp[l][r][pre];
ll ans=a[pre]+dfs(l+1,r,0);
for(int i=l+1;i<=r;i++)