總時間限制:
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
21 4考慮到需要輸出,
所以用vector來記錄、】
1 #include2 #include3 #include4 #include5 #include6 #include7using
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 第二行輸出該子串行...