hdu 2476 String painter【区间dp】

来源:互联网 发布:淘宝补单技巧 编辑:程序博客网 时间:2024/06/03 13:52



点击打开链接


题意: 

            给你两个字符串,a,and b

            问你a->b,最少需要几步。

    每步的操作是这样的,可以选定区间[l,r]使其中的字符都变成某个字符。


题解:


  首先处理字符串b。

          由空串->b串可以由一个区间转化而来,

          然后用一个ans数组记录空->b的前i项最小变化量,

  最后比较a串,

   如果a[i]==b[i],那么ans[i]=ans[i-1];

  否则,再遍历一遍前i区间的组合,确定ans[i]的最小值。


#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn=105;char a[maxn],b[maxn];int ans[maxn];int dp[maxn][maxn];int main(){    while(~scanf("%s %s",a+1,b+1)){        memset(dp,0,sizeof(dp));        int la=strlen(a+1);        for(int l=0;l<=la;++l){            for(int i=1;i+l<=la;++i){                int j=i+l;                dp[i][j]=dp[i+1][j]+1;                for(int k=i+1;k<=j;++k){                    if(b[i]==b[k])dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);                }            }        }        for(int i=1;i<=la;++i) ans[i]=dp[1][i];        for(int i=1;i<=la;++i){            if(a[i]==b[i]){                ans[i]=ans[i-1];            }else{                for(int k=1;k<i;++k){                    ans[i]=min(ans[i],ans[k]+dp[k+1][i]);                }            }        }        printf("%d\n",ans[la]);    }    return 0;}


原创粉丝点击