dp--LIS

Longest Increasing Subsequence

求最长上升子序列

定义\(dp[i]\)表示以\(i\)结尾的最长上升子序列的长度,O(\(n^2\))

for(int i = 1; i <= n; i++) 
{
    for(int j = 1; j < i; j++) 
    {
        if(a[i] > a[j]) dp[i] = max(dp[i],dp[j]+1);
    }
}

定义\(dp[i]\)表示长度为\(len\)的上升子序列的第\(i\)个数,O(\(nlogn\))

int b[maxn];b[1] = a[1];
int len = 1;
for(int i = 2; i <= n; i++) 
{
    if(a[i] > b[len]) b[++len] = a[i];
    else *lower_bound(b+1,b+len+1,a[i]) = a[i];
}

求最长上升子序列的划分,等于求最长不上升子序列的长度

比如4 1 5 9 2

可以划分成4 5 6 , 1 2

最长不上升子序列9 2

posted @ 2020-02-01 19:33  hezongdnf  阅读(192)  评论(0编辑  收藏  举报