標籤:poj lis
題目連結:
POJ 2533:http://poj.org/problem?id=2533
POJ 1631:http://poj.org/problem?id=1631
Description
A numeric sequence of
ai is ordered if
a1 <
a2 < ... <
aN. Let the subsequence of the given numeric sequence (
a1,
a2, ...,
aN) be any sequence (
ai1,
ai2, ...,
aiK), where 1 <=
i1 <
i2 < ... <
iK <=
N. For example, sequence (1, 7, 3, 5, 9, 4, 8) has ordered subsequences, e. g., (1, 7), (3, 4, 8) and many others. All longest ordered subsequences are of length 4, e. g., (1, 3, 5, 8).
Your program, when given the numeric sequence, must find the length of its longest ordered subsequence.
Input
The first line of input file contains the length of sequence N. The second line contains the elements of sequence - N integers in the range from 0 to 10000 each, separated by spaces. 1 <= N <= 1000
Output
Output file must contain a single integer - the length of the longest ordered subsequence of the given sequence.
Sample Input
71 7 3 5 9 4 8
Sample Output
4
Source
Northeastern Europe 2002, Far-Eastern Subregion
LIS果題。
代碼如下:
#include <cstdio>#include <iostream>#include <algorithm>int N;int ans;int a[1017], dp[1017];int bin(int len, int tem){ int l = 1, r = len; while(l <= r) { int mid = (l+r)/2; if(tem > dp[mid]) l = mid+1; else r = mid-1; } return l;}int LIS(int *b){ dp[1] = a[1]; ans = 1; int k; for(int i = 2; i <= N; i++) { if(a[i] < dp[1]) k = 1; else if(a[i] > dp[ans]) k = ++ans; else k = bin(ans,a[i]); dp[k] = a[i]; } return ans;}int main(){ while(~scanf("%d",&N)) { for(int i = 1; i <= N; i++) { scanf("%d",&a[i]); } LIS(a); printf("%d\n",ans); } return 0;}
POJ 1631 和這題基本上一樣,只需改一下數組大小,叫一個多測試案例輸入的迴圈即可!
這裡也貼一下代碼:
#include <cstdio>#include <iostream>#include <algorithm>int N;int ans;int a[40017], dp[40017];int bin(int len, int tem){ int l = 1, r = len; while(l <= r) { int mid = (l+r)/2; if(tem > dp[mid]) l = mid+1; else r = mid-1; } return l;}int LIS(int *b){ dp[1] = a[1]; ans = 1; int k; for(int i = 2; i <= N; i++) { if(a[i] < dp[1]) k = 1; else if(a[i] > dp[ans]) k = ++ans; else k = bin(ans,a[i]); dp[k] = a[i]; } return ans;}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%d",&N); for(int i = 1; i <= N; i++) { scanf("%d",&a[i]); } LIS(a); printf("%d\n",ans); } return 0;}
poj 2533 & poj 1631 Longest Ordered Subsequence( LIS果題 )