zoukankan      html  css  js  c++  java
  • 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
    ",res[len-1]);
        }
        return 0;
    }
  • 相关阅读:
    第九周
    第八周
    第七周
    代码复审核查表
    对软件开发的理解
    第六周
    网站流量分析架构及实现
    hive的sql语句
    精简客户端搭建Oracle数据库
    idaa搭建maven发布tomcat
  • 原文地址:https://www.cnblogs.com/jiangjing/p/3691700.html
Copyright © 2011-2022 走看看