zoukankan      html  css  js  c++  java
  • UVA 1045 最长公共子序列

    题目描述:求最长公共子序列

                  若给定序列X={x1,x2,...,xm},另一序列Z={z1,z2,...,zk},是X的子序列是指存在一个严格递增的下标序列{i1,i2,...,ik}使得对所以j=1,2,...,k有zj=x(ij)

                  例如Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}

    分析:DP的经典题

            状态表示:d[i,j]记录序列x(i)和y(j)的最长公共子序列,其中x(i)={x1,x2,...,xi},y(j)={y1,y1,...,yj},原问题最优解为d[len1,len2]

            转移方程:i=0或j=0时,d[i][j]=0;

                          xi=yj时,d[i][j]=d[i-1][j-1]+1;

                          xi != yj 时,d[i][j]=max( d[i-1][j],d[i][j-1] )

     1 #include<cstdio>
     2 #include<cstring>
     3 int d[1005][1005];
     4 int max(int a,int b)
     5 {
     6     return a>b ? a : b;
     7 }
     8 int main()
     9 {
    10     char rank1[1005],rank2[1005];
    11     int i,j;
    12     while(gets (rank1+1))
    13     {
    14         gets(rank2+1);
    15         memset(d,0,sizeof(d));
    16         int len1=strlen(rank1+1);
    17         int len2=strlen(rank2+1);
    18         for(i=1; i<=len1; i++)
    19             for(j=1; j<=len2; j++)
    20             {
    21                 if(rank1[i]==rank2[j])
    22                     d[i][j]=d[i-1][j-1]+1;
    23                 else
    24                     d[i][j]=max(d[i-1][j],d[i][j-1]);
    25             }
    26         printf("%d
    ",d[len1][len2]);
    27     }
    28     return 0;
    29 }
  • 相关阅读:
    函数式编程
    _.pick lodash
    Vue mixins extend
    js 导入json配置文件
    FormData
    shell中的调试与计算
    linux命令(6/10):find 命令
    Linux性能测试分析命令_sar+iostat+vmstat+top
    linux命令详解之(at)
    linux命令(6/9):watch命令
  • 原文地址:https://www.cnblogs.com/sage-blog/p/3646388.html
Copyright © 2011-2022 走看看