HDU_3853_区间dp

http://acm.hdu.edu.cn/showproblem.php?pid=3853

 

dp[i][j]表示由空白串刷成b的从i到j位所需要的最小次数。

然后在比较a和b的每一位,再次更新dp表示由a刷成b的最小次数。

 

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

char a[105],b[105];
int dp[105][105],ans[105];

int main()
{
    while(~scanf("%s%s",a,b))
    {
        memset(dp,0,sizeof(dp));
        int len = strlen(a);
        for(int i = 0;i < len;i++)    dp[i][i] = 1;
        for(int i = 1;i < len;i++)
        {
            for(int start = 0;start+i < len;start++)
            {
                int endd = start+i;
                dp[start][endd] = dp[start+1][endd]+1;
                for(int j = start+1;j <= endd;j++)
                {
                    if(b[start] == b[j])    dp[start][endd] = min(dp[start][endd],dp[start+1][j]+dp[j+1][endd]);
                }
            }
        }
        if(a[0] == b[0])    dp[0][0] = 0;
        for(int i = 1;i < len;i++)
        {
            if(a[i] == b[i])    dp[0][i] = dp[0][i-1];
            else
            {
                for(int j = 0;j < i;j++)    dp[0][i] = min(dp[0][i],dp[0][j]+dp[j+1][i]);
            }
        }
        printf("%d\n",dp[0][len-1]);
    }
    return 0;
}

 

posted @ 2016-09-20 17:02  zzzzzzzzhu  阅读(107)  评论(0编辑  收藏  举报