最长公共子上升序列(信息学奥赛一本通-T1306)
生活随笔
收集整理的這篇文章主要介紹了
最长公共子上升序列(信息学奥赛一本通-T1306)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
給定兩個整數序列,寫一個程序求它們的最長上升公共子序列。
當以下條件滿足的時候,我們將長度N的序列S1,S2,...,SN 稱為長度為M的序列A1,A2,...,AM的上升子序列:
存在1≤i1<i2<...<iN≤M,使得對所有1≤j≤N,均有Sj=Aij,且對于所有的1≤j<N,均有Sj<Sj+1。
【輸入】
每個序列用兩行表示,第一行是長度M(1≤M≤500),第二行是該序列的M個整數Ai(?231≤Ai<231)
【輸出】
在第一行,輸出兩個序列的最長上升公共子序列的長度L。在第二行,輸出該子序列。如果有不止一個符合條件的子序列,則輸出任何一個即可。
【輸入樣例】
5
1 4 2 5 -12
4
-12 1 2 4
【輸出樣例】
2
1 4
【源程序】
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 501 #define MOD 100001 #define E 1e-12 using namespace std; struct Node{int len;int ans[N]; }order[N],now; int a[N],b[N]; 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<=m;++i){now.len=0;memset(now.ans,0,sizeof(now.ans));for(int j=1;j<=n;++j){if(a[j]<b[i]&&order[j].len>now.len)now=order[j];if(a[j]==b[i]){order[j]=now;order[j].len++;order[j].ans[order[j].len]=a[j];}}}int flag=0;int maxx=-INF;for(int i=1;i<=n;++i)if(order[i].len>maxx){maxx=order[i].len;flag=i;}cout<<order[flag].len<<endl;for(int i=1;i<=order[flag].len;++i)cout<<order[flag].ans[i]<<" ";cout<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的最长公共子上升序列(信息学奥赛一本通-T1306)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lilypad Pondg(POJ-31
- 下一篇: 奇数单增序列(信息学奥赛一本通-T117