Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 36560 | Accepted: 16087 |
Description
Input
Output
Sample Input
7 1 7 3 5 9 4 8
Sample Output
4
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> using namespace std; int a[1100]; int dp[1100]; int main (){ int n,ans; while(cin>>n){ int i, j; for(i = 1;i <= n; ++i) cin>>a[i]; ans = 1; for(i=1;i<=n;++i) dp[i]=1; for(i = 2; i <= n; ++i) for(j = i-1; j >= 1; --j){ if(a[i] > a[j] && dp[i] <= dp[j]){ dp[i] = dp[j] + 1; if(dp[i] > ans) ans = dp[i]; } } cout<<ans<<endl; } return 0; }
2015 年 4 月25更新
二分搜索,时间更快,还能记录最优解。
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int inf = 0x3f3f3f3f; const int MAX = 10005; //二分法搜索digit,若s中存在digit,返回其下标 //若不存在,返回str中比digit小的最大那个数的(下标 + 1) int serch(int s[], int digit,int length){ int l = 0, r = length, mid; while(r != l){ mid = (l + r) / 2; if(digit == s[mid]) return mid; else if(digit < s[mid]) r = mid; else l = mid + 1; } return l; } int main (){ int n; int i,j; while(~scanf("%d", &n)){ int a[MAX]; int s[MAX]; for(i = 1; i <= n; ++i) scanf("%d", &a[i]); s[0] = -inf; //下界无穷小 int len = 1; //s的长度 for(i = 1; i <= n; ++i){ s[len] = inf;//上界无穷大,指针len总总指向s最后一个元素的后一位 j = serch(s, a[i], len); //printf("----%d\n",j); if(j == len) //a[i]大于s最大(最后)的元素 len++; s[j] = a[i]; } printf("%d\n", len - 1);//len 要减去1 //for(i = 1; i < len; ++i) // printf("%d ",s[i]); } return 0; }