动态规划-最长公共子序列(输出子序列)

题目:51node 1006

题意:找出公共子序列并输出,若有多个,输出一个就行

方法:先用一个二维数组dp[i][j]记录字符串 s1,s2长度分别为i和j时的最长公共子序列,在根据二维数组的值回溯;

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int dp[1010][1010];
char s[1010][1010];
string ss = "";
int main()
{
    string s1,s2;
    cin >> s1 >> s2;
    int len1 = s1.length();
    int len2 = s2.length();
    memset(dp,0,sizeof(dp));
    
     for(int i = 1;i <= len1;++i){
            for(int j = 1;j <= len2;++j){
                if( s1[i-1]==s2[j-1] ) dp[i][j] = dp[i-1][j-1]+1;
                else {
                    dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
                //    dp[i][j] = max(dp[i][j],dp[i-1][j-1]);
                }
            }
        }
    
    while( dp[len1][len2]>0 ) {
        if( dp[len1][len2]==dp[len1-1][len2] ){
            len1--;
        }
        else if( dp[len1][len2]==dp[len1][len2-1] ){
            len2--;
        }
        else{
            ss.insert(0,string(1,s1[len1-1]));         //string(num,str)代表生成一个字符串,包含num个str字符;每次插入的位置是第一个,因为是从后往前存
            len1--;
            len2--;        
        }
    }
//    cout << dp[len1][len2] << endl;
    cout << ss << endl;
    return 0;
}

 

posted @ 2018-09-29 16:29  岁岁长安  阅读(227)  评论(0编辑  收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中