直接判断两端颜色是否相同,然后直接记忆化搜索就可以了。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
#define maxn 110
int dp[maxn][maxn];
char st[maxn];
int n,siz[maxn],num[maxn];
int dfs(int l,int r)
{
if(l>r) return 0;
if(l==r) return 1;
if(dp[l][r]) return dp[l][r];
int tmp=r-l+1;
for(int i=l;i<r;i++)
{
tmp=min(tmp,dfs(l,i)+dfs(i+1,r)-(st[l]==st[r]));
}
return dp[l][r]=tmp;
}
int main()
{
scanf("%s",st+1);
n=strlen(st+1);
int tmp;
dfs(1,n);
printf("%d\n",dp[1][n]);
return 0;
}