zoukankan      html  css  js  c++  java
  • 动态规划 二.最长子序列

    问题描述:

    给定两个子序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,则称Z时X和Y的公共子序列。

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int const N=81;
     5 
     6 void lcslength(int m,int n,char *x,char *y,int c[][N],int b[][N])
     7 {
     8     int i,j;
     9     for(i=1;i<=m;i++) c[i][0]=0;
    10     for(i=1;i<=n;i++) c[0][i]=0;
    11     for(i=1;i<=m;i++)
    12     for(j=1;j<=n;j++)
    13     {
    14         if(x[i]==y[j])
    15         {
    16             c[i][j]=c[i-1][j-1]+1;
    17             b[i][j]=1;
    18         }
    19         else if(c[i-1][j]>c[i][j-1])
    20         {
    21             c[i][j]=c[i-1][j];
    22             b[i][j]=2;
    23         }
    24         else {
    25             c[i][j]=c[i][j-1];
    26             b[i][j]=3; 
    27         }
    28      } 
    29  } 
    30  
    31 void lcs(int i,int j,char *x,int b[][N])
    32 {
    33     if(i==0||j==0)return;
    34     if(b[i][j]==1) 
    35     {
    36         lcs(i-1,j-1,x,b);
    37         cout<<x[i]<<" ";
    38     }
    39     else if(b[i][j]==2)
    40     lcs(i-1,j,x,b);
    41     else lcs(i,j-1,x,b);
    42 }
    43 
    44 int main()
    45 {
    46     char x[N],y[N];
    47     int c[N][N],b[N][N];
    48     int m,n;
    49     cin>>m;
    50     for(int i=1;i<=m;i++)
    51     cin>>x[i];
    52     cin>>n;
    53     for(int i=1;i<=n;i++)
    54     cin>>y[i];
    55     lcslength(m,n,x,y,c,b);
    56     lcs(m,n,x,b);
    57     return 0;
    58 }
  • 相关阅读:
    2019/1/2
    2018/12/22
    2018/12/18
    2018/12/17
    2018/12/16
    编程总结汇总
    学习总结汇总
    第十三周学习总结--助教
    第十一周编程总结
    第10周编程总结
  • 原文地址:https://www.cnblogs.com/yuanqingwen/p/12748301.html
Copyright © 2011-2022 走看看