先发个程序:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int main() { int a[1001], b[1001], i, j, k, n; cin>>n; for(i = 1; i <= n; i++) cin>>a[i]; k=1; b[1]=a[1]; for(i=2;i<=n;i++) { if(a[i]>b[k]) b[++k]=a[i]; else { j=k; while(a[i]<=b[j])//这个while循环是关键 j--; b[j+1]=a[i]; } } cout<<k<<endl; return 0; }
调试下这个程序你就知道用二分搜索算法做这题的基本思想了;
而二分搜索算法就是把上面while循环改进了一下;
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define maxn 1008 #define inf 10001; using namespace std; int s[maxn], a[maxn]; //二分法搜索digit,若s中存在digit,返回其下标;若不存在,返回s中比digit小的 最大的那个数的 下标加1; int binary_serch(int digit, int len) { int left = 0, right = len, mid; while(left != right) { mid = (left + right)/2; if(digit == s[mid]) return mid; else if(digit < s[mid]) right = mid; else left = mid+1; } return left; } int main() { int i, j, n, k; while(~scanf("%d", &n)) { for(i = 0; i < n; i++) scanf("%d", &a[i]); s[0] = a[0]; k = 1; for(i = 1; i < n; i++) { s[k] = inf; j = binary_serch(a[i], k); if (j == k) k++; s[j] = a[i]; } cout<<k<<endl; } return 0; }