hdu 2476(第一道区间dp)

题意:就是给定两个字符串,第一个是初始串,第二个是目标串,问你把初始串变到目标串最少需要多少串!

分析:此题分两步,第一步是假设开始的初始串是空串,然后就进行区间dp,dp[i][j]代表把区间[i,j]变到与目标串相同的时候最少需要的步数,所以可以初始化dp[i][j]=dp[i+1][j]+1;

然后如果str2[i]==str2[k]就可以有dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j])。具体看代码实现吧!

代码实现:

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

int dp[105][105],res[105];
char str1[105],str2[105];

int min(int x,int y)
{
    return x<y?x:y;
}

int main()
{
    int i,j,k,len;
    while(scanf("%s%s",str1,str2)!=EOF)
    {
       len=strlen(str1);
       memset(dp,0,sizeof(dp));
       for(j=1;j<=len;j++)
       {
           for(i=0;i<len-j+1;i++)
           {
               dp[i][i+j-1]=dp[i+1][i+j-1]+1;
               for(k=i+1;k<=i+j-1;k++)
               {
                  if(str2[i]==str2[k])
                      dp[i][i+j-1]=min(dp[i][i+j-1],dp[i+1][k]+dp[k+1][i+j-1]);
               }
           }
       }

       for(i=0;i<len;i++)
           res[i]=dp[0][i];

       for(i=0;i<len;i++)
       {
           if(str1[i]==str2[i])
           {
               if(i==0)
                   res[i]=0;
               else
                   res[i]=res[i-1];
           }
           else
           {
               for(j=0;j<i;j++)
                   res[i]=min(res[i],res[j]+dp[j+1][i]);
           }
       }

       printf("%d\n",res[len-1]);
    }
    return 0;
}

 

posted on 2014-04-26 16:35  后端bug开发工程师  阅读(2072)  评论(0编辑  收藏  举报

导航