ACM common template created by kuangbin Last build at July 8, 2018

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;
}
posted @ 2022-03-12 12:59  JIeJaitt  阅读(63)  评论(0编辑  收藏  举报