zoukankan      html  css  js  c++  java
  • 51Nod1006最长公共子序列Lcs

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
    比如两个串为:
     
    abcicba
    abdkscab
     
    ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
     

    输入

    第1行:字符串A
    第2行:字符串B
    (A,B的长度 <= 1000)

    输出

    输出最长的子序列,如果有多个,随意输出1个。

    输入样例

    abcicba
    abdkscab

    输出样例

    abca

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 char a[1020],b[1020];
     7 int f[1020][1020];
     8 int ans[1020][1020];
     9 void dfs(int x,int y){
    10     if(x==0||y==0) return;
    11     if(ans[x][y]==0){
    12         dfs(x-1,y-1);
    13         cout<<b[y];
    14     }
    15     else if(ans[x][y]==1){
    16         dfs(x-1,y);
    17     }
    18     else{
    19         dfs(x,y-1);
    20     }
    21 }
    22 int main(){
    23     cin>>a>>b;
    24     int l1=strlen(a),l2=strlen(b);
    25     for(int i=l1;i>=1;i--) a[i]=a[i-1];
    26     for(int i=l2;i>=1;i--) b[i]=b[i-1];
    27     for(int i=1;i<=l1;i++){
    28         for(int j=1;j<=l2;j++){
    29             if(a[i]==b[j]){
    30                 f[i][j]=f[i-1][j-1]+1;
    31                 ans[i][j]=0;
    32             }
    33             else if(f[i-1][j]>=f[i][j-1]){
    34                 f[i][j]=f[i-1][j];
    35                 ans[i][j]=1;
    36             }
    37             else{
    38                 f[i][j]=f[i][j-1];
    39                 ans[i][j]=-1;
    40             }
    41         }
    42     }
    43     //cout<<f[l1][l2];
    44     dfs(l1,l2);
    45     return 0;
    46 }
  • 相关阅读:
    P2045 方格取数加强版
    P2774 方格取数问题
    日记——OI历程
    6.30考试
    6.29考试
    数论...
    6.28数论测试
    洛谷P3802 小魔女帕琪
    hosts
    博客设置
  • 原文地址:https://www.cnblogs.com/sz-wcc/p/10418926.html
Copyright © 2011-2022 走看看