标签:
5 1 4 2 5 -12 4 -12 1 2 4
2 1 4
/* 最长上升公共子序列 f(i1,i2)表示a1与a2[0..i2],以a1[i1]结尾的最长上升公共子序列 若a2[i2]==a1[i1], f(i1,i2)=max{ f(i,i2-1) }+1 (0<=i<i1) 若a2[i2]<a1[i1],f(i1,i2)不变 若a2[i2]>a1[i1],f(i1,i2)不变, max{ f(i,i2) }的值更新 */ #include <cstdio> #include <vector> using namespace std; const int maxn=510; int m1,m2,a1[maxn],a2[maxn]; struct node{ int len; vector<int> iv; }ans[maxn],cur; int main(){ scanf("%d",&m1); for(int i=0;i<m1;i++) scanf("%d",&a1[i]); scanf("%d",&m2); for(int i=0;i<m2;i++) scanf("%d",&a2[i]); for(int i=0;i<maxn;i++) ans[i].len=0; for(int i2=0;i2<m2;i2++){ cur.len=0; cur.iv.clear(); for(int i1=0;i1<m1;i1++){ if(a2[i2]>a1[i1]&&ans[i1].len>cur.len) cur=ans[i1]; if(a2[i2]==a1[i1]){ ans[i1]=cur; ans[i1].len++; ans[i1].iv.push_back(a1[i1]); } } } int p=0; for(int i=1;i<m1;i++){ if(ans[p].len<ans[i].len) p=i; } printf("%d\n",ans[p].len); if(ans[p].iv.size()){ printf("%d",ans[p].iv[0]); for(int i=1;i<ans[p].iv.size();i++) printf(" %d",ans[p].iv[i]); } printf("\n"); return 0; }
标签:
原文地址:http://www.cnblogs.com/shenben/p/5564869.html