首页 > 其他 > 详细

LCS与打印路径

时间:2015-12-11 13:03:04      阅读:187      评论:0      收藏:0      [点我收藏+]

 

 

 

/*
    LCS
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000;
int dp[maxn][maxn], c[maxn][maxn];
int str1[maxn],str2[maxn];
int k;
void dfs(int i,int j){  //打印路径
    if(i == 0 || j == 0) return;
    if(c[i][j] == 1){
        dfs(i-1,j-1);
        k--;
        printf("%d%c",str1[i],k > 0 ? ‘ ‘:‘\n‘);
    }else if(c[i][j] == 2){
        dfs(i-1,j);
    }else{
        dfs(i,j-1);
    }
}
int main(){
    int n,m;
    while(scanf("%d",&n)!=EOF){
        for(int i = 1; i <= n; i++){
            scanf("%d",&str1[i]);
        }
        scanf("%d",&m);
        for(int i = 1; i <= m; i++){
            scanf("%d",&str2[i]);
        }
        for(int i = 1; i <= n; ++i){
            for(int j = 1; j <= m; j++){
                if(str1[i] == str2[j]){
                    dp[i][j] = dp[i-1][j-1] + 1;
                    c[i][j] = 1;
                }else if(dp[i-1][j] > dp[i][j-1]){
                    dp[i][j] = dp[i-1][j];
                    c[i][j] = 2;
                }else{
                    dp[i][j] = dp[i][j-1];
                    c[i][j] = 3;
                }
            }
        }
        printf("%d\n",dp[n][m]);
        k = dp[n][m];
        dfs(n,m);
    }
    return 0;
}

/*
7
1 2 3 2 4 1 2
6
2 4 3 1 2 1
*/

  

LCS与打印路径

原文:http://www.cnblogs.com/chengsheng/p/5038619.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!