[hdu2476]String painter(区间dp)

感觉自己发两篇一样的题解不太好

 CQOI2007 涂色 paint (区间dp)

没错就是前两天我闲得无聊发的这道题

只不过初始条件变了...

这道题初始木棍已经是涂过色的了...

然后我就又不会了

(那你为啥还在这儿发题解)

既然已经有初始颜色了,那么就说明有的地方会是不需要涂的(因为本来就是目标颜色)

那么相较于上面那道题的修改就在这里了

1 for(int i=1;i<=n;i++)
2     {
3         if(xl1[i]==xl2[i])dp2[i]=dp2[i-1];
4         else for(int k=0;k<i;k++)dp2[i]=min(dp2[i],dp2[k]+dp[k+1][i]);
5     }

我想还是挺好懂的

事实上本质就是再额外从头到尾dp一次...

只是如果某一格已经是原来的颜色那么涂完它前面所有格子就等同于多涂了它这一个格子

然后就又没了

#include<cstdio>
#include<cstring>
int min(int a,int b){return a<b?a:b;}
char in1[520],in2[520];
int xl1[520],xl2[520];
int dp[520][520],dp2[520];
int main()
{
while(scanf("%s%s",in1,in2)!=EOF)
{
    memset(dp,0x3f,sizeof(dp));
    memset(dp2,0x3f,sizeof(dp2));
    dp2[0]=0;
    memset(xl1,0,sizeof(xl1));
    memset(xl2,0,sizeof(xl2));
//    scanf("%s",in2);
    int n=strlen(in1);
    for(int i=0;i<=n+1;i++)dp[i][i]=1;
    for(int i=0;i<n;i++)
    {
        xl1[i+1]=in1[i];
        xl2[i+1]=in2[i];
    }
    for(int d=1;d<n;d++)
    {
        for(int i=1;i+d<=n;i++)
        {
            if(xl2[i]==xl2[i+d])dp[i][i+d]=min(dp[i][i+d-1],dp[i+1][i+d]);
            for(int k=i;k<i+d;k++)dp[i][i+d]=min(dp[i][i+d],dp[i][k]+dp[k+1][i+d]);
        }
    }
//    printf("%d\n",dp[1][n]);
    for(int i=1;i<=n;i++)
    {
        if(xl1[i]==xl2[i])dp2[i]=dp2[i-1];
        else for(int k=0;k<i;k++)dp2[i]=min(dp2[i],dp2[k]+dp[k+1][i]);
    }
    printf("%d\n",dp2[n]);
}
return 0;
}

猜你喜欢

转载自www.cnblogs.com/rikurika/p/9996164.html
今日推荐