题目链接:
POJ 2533:http://poj.org/problem?id=2533
POJ 1631:http://poj.org/problem?id=1631
Description
Input
Output
Sample Input
7 1 7 3 5 9 4 8
Sample Output
4
Source
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果题 )
原文地址:http://blog.csdn.net/u012860063/article/details/39001081