Vijos-2164 神祕的咒語 [LCIS最長公共上升子序列]
阿新 • • 發佈:2019-02-01
描述
身為拜月教的高階間諜,你的任務總是逼迫你出生入死。比如這一次,拜月教主就派你跟蹤趙靈兒一行,潛入試煉窟底。
據說試煉窟底藏著五行法術的最高法術:風神,雷神,雪妖,火神,山神的咒語。為了習得這些法術,要付出艱辛的努力,但是回報同樣十分豐厚。
拜月希望你告訴他咒語的長度為多少。(你:“請問您想知道咒語的具體內容嗎?”拜月:“想,但是vijos不支援special judge。”-_-原來大人物也有大人物的悲哀。。。)
於是你偷偷躲在一邊,想乘機看看咒語究竟是什麼。突然,天空(??試煉窟底看的到天空??)出現了兩條非常長的數字串,你抓狂了。究竟哪個才是真正的咒語呢?你突然想到,這兩個都不是咒語(不妨稱之為偽咒語),而真正的咒語卻與他們有著密切的聯絡。於是你開啟拜月親手給你寫的紙條:"The Real Incantation is Their Common Increasing Subsequence of Maximal Possible Length"
"該死的拜月,居然還會E文!"你咒罵著,但為了一家老小的生命,又不得不賣命地算著咒語的長度。
格式
輸入格式
第一行為1個數N,代表有N組測試資料。
對於每組測試資料,描述了兩條數字串,首先一個數字為一條偽咒語的長度M,接下來M個數描述了偽咒語的內容。
輸出格式
共N行,每行一個數字,描敘了對應咒語的長度。
樣例1
樣例輸入1
1
5 1 4 2 5 -12
4 -12 1 2 4
Copy
樣例輸出1
2
Copy
限制
1s
提示
對於100%的資料,有1<=N<=5,1<=M<=500,Ai,Bi在長整型範圍內。
來源
經典問題
第一次做LICS,感覺有點迷 但是看了論文之後豁然開朗,有興趣的同學可以看一看
Accepted
# | 狀態 | 耗時 | 記憶體佔用 |
---|---|---|---|
程式碼
#include <bits/stdc++.h>
using namespace std;
int n, m1, m2, a[505], b[505], f[505];
int main()
{
cin >> n;
while(n--)
{
cin >> m1;
for(int i = 1; i <= m1; ++i)
scanf( "%d", &a[i] );
cin >> m2;
for(int i = 1; i <= m2; ++i)
scanf( "%d", &b[i] );
for(int i = 1, mx; i <= m1; ++i)
{
mx = 0;
for(int j = 1; j <= m2; ++j)
{
if(a[i] > b[j]) mx = max(mx, f[j]);
if(a[i] == b[j]) f[j] = mx + 1;
}
}
int ans = 0;
for(int i = 1; i <= m2; ++i) ans = max(ans, f[i]);
cout << ans << endl;
fill(f + 1, f + max(m1, m2) + 1, 0);
}
return 0;
}