Codevs 2188 最長上公升子串行

2021-08-07 16:37:10 字數 1138 閱讀 2264

題目:

題意:

給定長度為n的序列,求包含第k個元素的最長嚴格上公升子串行的長度;

nlogn的lcs解法簡析:

維護乙個g[i]陣列表示長度為i的上公升子串行的最小末尾元素。

每次加入x,在g[i]陣列中找第乙個大於或等於x的位置pos,並用x替換它。

首先,g陣列裡現有的數,在原陣列中都在x前面。

在pos前的數,都小於x,pos後的數,都大於x,而x比pos上原來的數小,用x替換,顯然更優。

那麼g維護的,其實是當前最長且最優(每乙個數都盡量小,使得長度擴大的可能性盡量大)的上公升子串行

題解:

1~k-1,大於num[k]的刪掉;

k+1~n,大於num[k]的刪掉;

分別求lis;

注意:

二分求lis;

upper_bound

返回乙個迭代器,其指向範圍中,第乙個值大於 val 的元素。

如果所有的元素的值都不大於(即小於或等於) val,則返回 last。

lower_bound

返回乙個迭代器,其指向範圍中,第乙個值大於或等於 val 的元素。

如果所有的元素的值都小於 val,則返回 last。

嚴格上公升,應該用lower_bound;

**:

#include

#include

#include

using

namespace

std;

const

int n=200000+50;

int n,k;

int num[n],g[n],h[n],tot,to,x;

int main()

for(int i=k;i<=n;i++)

// printf("%d %d\n",tot,to);

printf("%d",tot+to+1);

return

0;}

Dp 最長上公升子串 最長上公升子串行

乙個數的子串bi,當b1 b2 bs的時候,我們稱這個子串是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串 ai1,ai2,aik 這裡1 i1 i2 ik n。如 對於序列 1,7,3,5,9,4,8 有它的一些上公升子串,如 1,7 3,5,9 等等。這些子串中最長...

最長上公升子串行

問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...

最長上公升子串行

最長上公升子串行問題是各類資訊學競賽中的常見題型,也常常用來做介紹動態規劃演算法的引例,筆者接下來將會對poj上出現過的這類題目做乙個總結,並介紹解決lis問題的兩個常用 演算法 n 2 和 nlogn 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1...