1. 程式人生 > >Vijos-2164 神祕的咒語 [LCIS最長公共上升子序列]

Vijos-2164 神祕的咒語 [LCIS最長公共上升子序列]

描述

身為拜月教的高階間諜,你的任務總是逼迫你出生入死。比如這一次,拜月教主就派你跟蹤趙靈兒一行,潛入試煉窟底。

據說試煉窟底藏著五行法術的最高法術:風神,雷神,雪妖,火神,山神的咒語。為了習得這些法術,要付出艱辛的努力,但是回報同樣十分豐厚。

拜月希望你告訴他咒語的長度為多少。(你:“請問您想知道咒語的具體內容嗎?”拜月:“想,但是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

# 狀態 耗時 記憶體佔用
#1  Accepted  3ms 316.0 KiB
#2  Accepted  2ms 312.0 KiB
#3  Accepted  4ms 324.0 KiB
#4  Accepted  5ms 312.0 KiB
#5  Accepted  4ms 316.0 KiB
#6  Accepted  4ms 316.0 KiB
#7  Accepted  3ms 328.0 KiB
#8  Accepted  3ms 316.0 KiB
#9  Accepted  3ms 320.0 KiB
#10  Accepted 
3ms 316.0 KiB

程式碼

#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;
}