题解 P4170 【[CQOI2007]涂色】
此题是道区间dp,其实代码很简单,结合注释即可理解
不会区间dp板子的就算了
上代码(有注释)
#include<bits/stdc++.h>
using namespace std;
int n,m,ans,dp[51][51];//dp[i][j]表示i到j涂好的最少次数
char color[51];
int main()
{
cin>>color;
n=strlen(color);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dp[i][j]=999999999;
}
}
for(int i=1;i<=n;i++)
dp[i][i]=1;//涂好自己需1次,初始化
for(int l=2;l<=n;l++)
{
for(int i=1;i+l-1<=n;i++)
{
int j=i+l-1;//区间dp板子
if(color[i-1]==color[j-1])//特判,我从0读入故减1
{
dp[i][j]=min(dp[i+1][j],dp[i][j-1]);//判断左点还是右点是被"顺便"涂掉的
/*"顺便"意为第一次多涂一格*/
}
else
{
for(int k=i;k<j;k++)//否则分区间
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
}
}
cout<<dp[1][n];
}