题解:
比较水的区间dp。
我们令dp[i][j]表示i-j这段区间最少涂色次数
分两种情况
1:s[i],s[j]s[i],s[j]一样
f[i][j]=min(f[i+1][j],f[i][j−1]);f[i][j]=min(f[i+1][j],f[i][j−1]);
f[i][j]=min(f[i][j],f[i+1][j−1]+1);f[i][j]=min(f[i][j],f[i+1][j−1]+1);
2:s[i],s[j]s[i],s[j]不一样
f[i][j]=min(f[i][k]+f[k+1][j],f[i][j])f[i][j]=min(f[i][k]+f[k+1][j],f[i][j])
应该非常好理解。
Code:Code:
#include<bits/stdc++.h>
#define N 55
using namespace std;
char s[N];int dp[N][N];
int main()
{
scanf("%s",s);
int len=strlen(s);
for(int i=0;i<len;i++)dp[i][i]=1;
for(int j=1;j<len;j++)
for(int i=0;i<len-j;i++)
{
dp[i][i+j]=1000000000;
for(int k=i;k<=i+j-1;k++)
dp[i][i+j]=min(dp[i][i+j],dp[i][k]+dp[k+1][i+j]-int(s[i]==s[i+j]));
}
printf("%d",dp[0][len-1]);
return 0;
}