• pku2192Zipper(动态规划题,随机组合两个字符串)


    328K 16MS G++ 859B 2009-01-09 10:02:27

    因为看到最后组合的字符串长度会等于两个字符串长度之和,以为很简单,想用

     while(i<lenf||j<lens){
      if(third[i+j]==first[i])
       i++;
      else if(third[i+j]==second[j])
       j++;
      else
       return 0;
     }
     return 1;

    后来发现错(因为两个字符串中会有相同的字母,如first[i]==second[i]),又想了好一阵子,再借鉴别人的做法:

    1)创建一个数组f[n][m]记录第一个字符串的前n位与第二个字符串的前m位能否组合成第三个字符串的前n+m位。

    2)由于最后组合的字符串长度会等于两个字符串长度之和,那么问题就简单了,可想而知,组合后的字符串最后一位一定来源于第一个字符串或者第二个字符串的最后一位。所以分解为f[n-1][m]和f[n][m-1]的子问题。

    核心代码如下:

    if((f[i-1][j]&&first[i]==third[i+j])||(f[i][j-1]&&second[j]==third[i+j]))
        f[i][j]=1;
       else
        f[i][j]=0;

    初始化工作:

     

    if(first[1]!=third[1]&&second[1]!=third[1])
      return 0;
     else{
     if(first[1]==third[1])
      for(i=1;i<=lenf;i++)
       f[i][0]=1;
     if(second[1]==third[1])
      for(i=1;i<=lens;i++)
       f[0][i]=1;

     }

    代码如下:

     

    Code
  • 相关阅读:
    vsftp关于"550 create directory operation failed"问题解决
    CentOS 5.5 Samba服务器安装总结
    Centos 5.5下安装samba
    iptables里filter表前面几个数字的意思
    Linux误删C基本运行库libc.so.6急救方法
    Linux升级C基本运行库CLIBC
    MySQL的Grant命令
    Apache Options指令详解
    Apache的Order Allow,Deny 详解
    Python 中 open()文件操作的方式
  • 原文地址:https://www.cnblogs.com/pandy/p/1372326.html
Copyright © 2020-2023  润新知