04 最長公共子上公升序列

2022-05-09 19:20:43 字數 1486 閱讀 1493

總時間限制: 

10000ms

記憶體限制: 

65536kb

描述給定兩個整數序列,寫乙個程式求它們的最長上公升公共子串行。

當以下條件滿足的時候,我們將長度為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考慮到需要輸出,

所以用vector來記錄、】

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8const

int maxn=3001;9

const

int maxn=0x7fffff;10

void read(int &n)

1115

while(c>='

0'&&c<='9'

)16

17 flag==1?n=-x:n=x;18}

19int

a[maxn],b[maxn];

20int

n,m;

21int

pre[maxn];

22int

tot;

23struct

node

2432

}dp[maxn];

33int

main()

3455}56

}57 node ans=dp[1

];58

59for(int i=2;i<=m;i++)

60if(dp[i].l>ans.l)

61 ans=dp[i];

6263 printf("

%d\n

",ans.l);

64for(int i=0;i)

65 printf("

%d "

,ans.v[i]);

6667

return0;

68 }

最長公共子串行 最長上公升子串行 最長公共上公升子串行

核心 for int i 1 ifor int j 1 jif a i b j else hdu5248 樹狀陣列優化 nl ogn nlo gn include using namespace std const int maxn 100005 char a maxn int len int bi...

最長上公升子串行 最長公共上公升子串行

求最長公共子串行有幾種方法 include include using namespace std include include const int inf 0x3f3f3f3f const int maxn 10005 int a maxn ints maxn int dp maxn int d...

最長公共上公升子串行

題目描述 給定兩個整數序列,求它們的最長上公升公共子串行。輸入描述 輸入兩組資料,每組資料代表乙個整數序列,其輸入格式為 第一行輸入長度m 1 m 500 第二行輸入該序列的m個整數ai 231 ai 231 輸出描述 輸出共兩行。第一行輸出兩個序列的最長上公升公共子串行的長度l 第二行輸出該子串行...