區間DP
設爲塗需要的最少次數。那麼若左右端點的顏色相同,則有。然後枚舉斷點,。
代碼:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 55
using namespace std;
int n,ans=1e9,f[N][N]; char s[N];
int dfs(int l,int r){
if (~f[l][r]) return f[l][r];
if (l==r) return f[l][r]=1; f[l][r]=1e9;
if (s[l]==s[r]) f[l][r]=min(f[l][r],min(dfs(l,r-1),dfs(l+1,r)));
for (int i=l;i<r;i++) f[l][r]=min(f[l][r],dfs(l,i)+dfs(i+1,r));
return f[l][r];
}
int main(){
scanf("%s",s+1),n=strlen(s+1);
memset(f,-1,sizeof(f));
return printf("%d\n",dfs(1,n)),0;
}