区间dp[i][j],枚举第一个,i,它可以自己消了,也可以附在后面任何一个相同的上消
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int n;
int dp[505][505];
char ch[505];
int dfs(int st,int ed)
{
if(dp[st][ed]!=-1)
return dp[st][ed];
if(st==ed)
return dp[st][ed]=1;
int ans=1e9+7;
ans=min(ans,1+dfs(st+1,ed));
for(int i=st+2;i<=ed;i++)
{
if(ch[st]==ch[i])
{
ans=min(ans,dfs(st+1,i-1)+dfs(i,ed));
}
}
return dp[st][ed]=ans;
}
string str;
int main() {
while(~scanf("%d",&n))
{
memset(dp,-1, sizeof(dp));
cin>>str;
int cnt=0;
for(int i=0;i<n;i++)
{
if(i==0 || str[i]!=str[i-1])
ch[cnt++]=str[i];
}
printf("%d\n",dfs(0,cnt-1));
}
return 0;
}