原题:
Description
Input
Output
Sample Input
6 5 2 1 4 5 3 3 1 1 1 4 4 3 2 1
Sample Output
3 1 1
Hint
#include<iostream> #include<cstdio> using namespace std; const int N = 100000 + 10; int a[N], dp[N]; // while循环实现 int binsearch(int *d, int left, int right, int key) { int mid; while (left <= right) { mid = left + ((right - left) >>1); if (d[mid] < key&&d[mid + 1] >= key) return mid; if (d[mid] < key&&d[mid + 1] < key) left = mid + 1; if (d[mid] == key) right = mid - 1; if (d[mid]>key) right = mid - 1; } return -1; } // 递归实现 //int binsearch(int *d,int left, int right, int key) //{ // // 搜索区间 [left ,right] // // if (left > right) // return -1; // // int mid = left+(right-left)/2; // if (d[mid] < key&&d[mid + 1] >= key) // return mid; // if (d[mid] == key) // right = mid - 1; // // else if (d[mid] < key){ //可以优化? // left = mid+1; // } // else if(d[mid]>key){ // right = mid - 1; // } // return binsearch(d, left, right, key); //} int main() { //int aa[N] = { 1, 1, 1, 1, 1 }; //cout << binsearch(aa, 0, 5, 1); int n; while (cin >> n) { for (int i = 0; i < n; i++) { scanf("%d", a + i); } dp[1] = a[0]; int len = 1, protected_len; for (int i = 1; i < n; i++) { if (i == 3) int oiu=3; if (a[i]>dp[len]){ len++; dp[len] = a[i]; } else{ protected_len = binsearch(dp,1,len,a[i]); //cout << "protencetd=" << protected_len << ‘ ‘ << a[i] << endl; if (protected_len != -1){ protected_len++; dp[protected_len] = a[i]; } else{ dp[1] = a[i]; } } } cout << len << endl; } return 0; }
原文:http://www.cnblogs.com/shawn-ji/p/4732819.html