hdu 2476(第一道區間dp)

題意:就是給定兩個字符串,第一個是初始串,第二個是目標串,問你把初始串變到目標串最少須要多少串!ios

分析:此題分兩步,第一步是假設開始的初始串是空串,而後就進行區間dp,dp[i][j]表明把區間[i,j]變到與目標串相同的時候最少須要的步數,因此能夠初始化dp[i][j]=dp[i+1][j]+1;spa

而後若是str2[i]==str2[k]就能夠有dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j])。具體看代碼實現吧!code

代碼實現:blog

#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;
}
相關文章
相關標籤/搜索