打印最长的公共子序列

时间:2019-03-04 07:31:32

标签: algorithm lcs

该代码显示最长公共子序列。我已经完成了记忆。但是答案是错误的。请帮忙。

第一行是数组的长度
接下来的两行是序列

例如:

输入

5 6

1 2 3 4 1

3 4 1 2 1 3

输出

1 2 3

或其他任何长度为3的LCS

但是我的解决方案给出了答案

3 4 1 2 1

我的代码:

#include<bits/stdc++.h>
using namespace std;

vector<int> lcs(int a[],int b[],int n,int m, unordered_map<string ,vector<int> > &map1){

    vector<int>v;
    vector<int>v1;
    vector<int>v2;
    if(n<0||m<0)
    {
        return v;
    }



    stringstream na;
    na<<n;
    string n1=na.str();
    stringstream ma;
    ma<<m;
    string m1=ma.str();
    string num =n1 + "#" + m1;


    if(map1.find(num)!=map1.end())
    return map1[num];
    if(a[n]==a[m]){
        v1=lcs(a,b,n-1,m-1,map1);
        v1.push_back(a[n]);
        map1[num]=v1;
        return v1;
    }
    v1=lcs(a,b,n-1,m,map1);
    v2=lcs(a,b,n,m-1,map1);

    v1.size()>v2.size() ? map1[num]=v1 : map1[num]=v2;
    return map1[num];
}






int main(){
    int t;
    int n,m;
    cin>>n>>m;
    int *a=new int[n];
    int *b=new int[m];
    for(int i=0;i<n;i++)
        cin>>a[i];
    for(int i=0;i<m;i++)
        cin>>a[i];
    vector<int>v;
    unordered_map<string,vector<int> > map1;
    v=lcs(a,b,n-1,m-1,map1);
    for(int i=0;i<v.size();i++)
        cout<<v[i]<<" ";
    cout<<"\n";
}

0 个答案:

没有答案