• 最长公共子序列


     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <string>
     6 using namespace std;
     7 #define N 1005
     8 int dp[N+1][N+1];
     9 int b[N+1][N+1];
    10 char str1[N],str2[N];
    11 void lcs(int len1,int len2)
    12 {
    13     for(int i=0;i<len1;i++){
    14         for(int j=0;j<len2;j++){
    15             if(str1[i]==str2[j]){
    16                 dp[i+1][j+1]=dp[i][j]+1;
    17                 b[i+1][j+1]=1;
    18             }
    19             else if(dp[i][j+1]>dp[i+1][j]){
    20                 dp[i+1][j+1]=dp[i][j+1];
    21                 b[i+1][j+1]=2;
    22             }else{
    23                 dp[i+1][j+1]=dp[i+1][j];
    24                 b[i+1][j+1]=3;
    25             }
    26         }
    27     }
    28     cout<<dp[len1][len2]<<endl;
    29 }
    30 void printLcs(int i,int j)
    31 {
    32     if(i==0||j==0) return;
    33     else if(b[i][j]==1){
    34         printLcs(i-1,j-1);
    35         cout<<str1[i-1];
    36     }else if(b[i][j]==2) printLcs(i-1,j);
    37     else printLcs(i,j-1);
    38 }
    39 int main()
    40 {
    41     while(cin>>str1>>str2){
    42         memset(dp,0,sizeof(dp));
    43         memset(b,0,sizeof(b));
    44         int len1=strlen(str1);
    45         int len2=strlen(str2);
    46         lcs(len1,len2);//求解序列长度
    47         printLcs(len1,len2);//打印序列
    48     }
    49     return 0;
    50 }
  • 相关阅读:
    浏览器渲染原理
    React Router
    链式 add 函数
    函数防抖和函数节流
    242. 有效的字母异位词
    faker 生成模拟数据
    A 第五课 二叉树与图
    使用递归解决问题
    A 第四课 递归_回溯_分治
    A 第三课 贪心算法
  • 原文地址:https://www.cnblogs.com/wydxry/p/10198990.html
Copyright © 2020-2023  润新知