题解 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];
}
posted @ 2019-01-28 11:54  G_A_TS  阅读(461)  评论(0编辑  收藏  举报