最长公共上升子序列-简明讲解
最长公共上升子序列,唯一不用说的一点就是两层循环,分别扫过
(注:本文内
将 内循环(
这个时候有人会问了,为什么不(用)取
听起来可能有点玄乎,咱贴份代码(带输出最长公共子序列,链式倒序输出(栈,递归 等)即可)
#include<iostream>
#include<stack>
using namespace std;
int a[550],b[550],dp[550],lnk[550];
int main(){
int n,m;
cin>>n;//任意长度
for(int i=1;i<=n;i++) cin>>a[i];
cin>>m;//任意长度
for(int i=1;i<=m;i++) cin>>b[i];
for(int i=1;i<=n;i++){
int t=0;
for(int j=1;j<=m;j++){
if(a[i]==b[j]){
dp[j]=dp[t]+1;
lnk[j]=t;
}
if(a[i]>b[j]&&dp[t]<dp[j]) t=j;//解决到j以后为后面着想
}
}
int p;//记录最长公共子序列的结尾位置
for(int i=1;i<=m;i++){
if(dp[i]>dp[p]) p=i;
}
cout<<dp[p]<<endl;
stack<int>s;
while(p!=0){
s.push(p);
p=lnk[p];
}
while(!s.empty()){//倒序从前往后输出,故用栈(或递归)输出
int now=s.top();
cout<<b[now]<<" ";
s.pop();
}
return 0;
}
(时间复杂度: