Description
Input
Output
Sample Input
7 1 7 3 5 9 4 8
Sample Output
4
题意:输出最长递增子序列的长度
思路:直接裸LIS,第一次使用,使用两种方法
第一种:复杂度n^2
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; int a[1005],dp[1005],n; int LIS() { int i,j,ans,m; dp[1] = 1; ans = 1; for(i = 2;i<=n;i++) { m = 0; for(j = 1;j<i;j++) { if(dp[j]>m && a[j]<a[i]) m = dp[j]; } dp[i] = m+1; if(dp[i]>ans) ans = dp[i]; } return ans; } int main() { int i; while(~scanf("%d",&n)) { for(i = 1;i<=n;i++) scanf("%d",&a[i]); printf("%d\n",LIS()); } return 0; }
第二种:nlogn
#include <stdio.h> #include <algorithm> #include <string.h> using namespace std; int a[1005],dp[1005],c[1005],n; int bin(int size,int k) { int l = 1,r = size; while(l<=r) { int mid = (l+r)/2; if(k>c[mid] && k<=c[mid+1]) return mid+1; else if(k<c[mid]) r = mid-1; else l = mid+1; } } int LIS() { int i,j,ans=1; c[1] = a[1]; dp[1] = 1; for(i = 2; i<=n; i++) { if(a[i]<=c[1]) j = 1; else if(a[i]>c[ans]) j = ++ans; else j = bin(ans,a[i]); c[j] = a[i]; dp[i] = j; } return ans; } int main() { int i; while(~scanf("%d",&n)) { for(i = 1; i<=n; i++) scanf("%d",&a[i]); printf("%d\n",LIS()); } return 0; }