题目链接
大概还是要对区间操作的。
定义dp[i][j]为涂色【i,j】最小花费。初始化dp[i][i]=1
其他的设置为inf。 考虑到转移,如果区间端点相等,那么直接转移
如果不相等就拆开该区间去转移。
char s[500];
ll dp[100][100];
signed main()
{
scanf("%s",s+1);
ll n=strlen(s+1);
memset(dp,inf,sizeof(dp));
for(int i=1; i<=n; i++)
{
dp[i][i]=1;
}
for(int len=1; len<=n; len++)
{
for(int i=1; i<=n; i++)
{
ll j=i+len;
if(j>n)
break;
if(s[i]==s[j])
{
dp[i][j]=min(dp[i+1][j],dp[i][j-1]);
continue;
}
for(int k=i; k<j; k++)
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]) ;
}
}
}
printf("%lld\n",dp[1][n]);
}