涂色

假设你有一条长度为5的木版,初始时没有涂过任何颜色。你希望把它的5个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为5的字符串表示这个目标:RGBGR。 每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。

例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标。 用尽量少的涂色次数达到目标。
 
第一次记录区间dp,有点类似模板,最外层枚举长度,再枚举起点,接着算出总店,在区间中进行枚举二分。
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll N=1e3+10;
ll n,dp[N][310];//题意:每次可以给任意的字符涂一个色
char a[N];
int main()
{
    cin>>a+1;
    n=strlen(a+1);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i==j)dp[i][j]=1;//当区间长度为一时的值
            else dp[i][j]=1e9;
        }
    }//初始化
    for(int len=2;len<=n;len++)//阶段:区间长度
    {
        for(int l=1;l<=n-len+1;l++)//状态:枚举左端点
        {
            int r=l+len-1; //状态:右端点
            if(a[l]==a[r])dp[l][r]=dp[l+1][r];//相当于i不用涂
            for(int k=l;k<r;k++)//决策 :找出最小次数
            {
                dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
            }
        }
    }
    cout<<dp[1][n]<<endl;
    return 0;
 }

 

posted @ 2020-04-28 00:11  ___Charles  阅读(279)  评论(0)    收藏  举报