6 动态规划
6.1 最长上升字符串 O(log n)
const int MAXN=500010;
int a[MAXN],b[MAXN];
/**
* 用二分查找的方法找到第一个位置
* 使得 num>b[i-1] 并且 num<b[i]
* 并用 num 代替 b[i]
*/
int Search(int num,int low,int high) {
int mid;
while(low<=high) {
mid=(low+high)/2;
if(num>=b[mid]) low=mid+1;
else high=mid-1;
}
return low;
}
int DP(int n) {
int i,len,pos;
b[1]=a[1];
len=1;
for(int i=2;i<=n;i++) {
if(a[i]>=b[len])
{ /* 如果 a[i] 比 b[] 数组中最大还大直接插入到后面即可 */
len=len+1;
b[len]=a[i];
}
else
{ /* 用二分的方法在 b[] 数组中找出第一个比 a[i] 大的位置并且让 a[i] 替代这个位置 */
pos=Search(a[i],1,len);
b[pos]=a[i];
}
}
return len;
}