動態規劃之最長上公升子串行(LIS模板)再整理

2021-08-18 04:01:59 字數 1546 閱讀 9383

1.o(n^2)lis模板

dp[i]代表:    必須以a[i]為結尾的lis的長度.

#include #includeusing namespace std;

const int nmax=1000+5;

int a[nmax];//儲存數值串行

int dp[nmax];//dp[i]記錄必須以a[i]為結尾的lis的長度

int main(int argc, char** argv)

int ans=1;//ans記錄整個序列的lis長度,初值為1

for(int i=1;i2.1 o(nlogn)lis模板(簡化版——使用lower_bound)

dp[i]代表: 假設當前遍歷到某個數cur,遍歷到當前時刻為止,長度為i+1的lis的最小末尾

#include #includeusing namespace std;

const int nmax=1000+5;

int a[nmax];//儲存數值串行

int dp[nmax];//dp[i]記錄必須以a[i]為結尾的lis的長度

const int inf=0x3f3f3f;

int main(int argc, char** argv)

for(int i=0;i2.2 o(nlogn)lis模板(自己實現了二分查詢的過程)

dp[i]代表: 假設當前遍歷到某個數cur,遍歷到當前時刻為止,長度為i+1的lis的最小末尾

#include #includeusing namespace std;

const int nmax=1000+5;

int a[nmax];//儲存數值串行

int dp[nmax];//dp[i]記錄遍歷到當前時刻為止,長度為i+1的lis的最小末尾

//int ends[nmax];//有效區陣列

const int inf=0x3f3f3f;

int main(int argc, char** argv)

int* ends=new int[n];//有效區陣列

ends[0]=a[0];//直接拷貝陣列中第乙個元素

dp[0]=1;

int right=0;//有效區的右邊界

//在有效區里二分查詢用到的變數

int l=0;//左查詢邊界

int r=0;//右查詢邊界

int m=0;//中間查詢的位置

for(int i=1;i=a[i]

r=m-1;}}

right=max(right,l);//如果沒找到,有效區右邊界擴充1個單位

//如果找到了,右邊界仍然為right

ends[l]=a[i];//若有效區中沒找到大於a[i]的數,更新新擴充的右邊界

//若有效區中找到大於a[i]的數,將該數改寫成a[i]

dp[i]=l+1;

} int ans=1;

for(int i=0;icout<}

return 0;

}

動態規劃 最長上公升子串行 LIS

最長上公升子串行 簡稱lis 1.問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1,s2,sn 使得這個子串行滿足這樣的性質,s1 dp i 以ai結尾 的最長上公升子串行 狀態轉移方程 dp i max 1 實現o n n 2 dp i max 1 ...

動態規劃 最長上公升子串行(LIS)

題目 好多好多球 描述一天,jason買了許多的小球。有n個那麼多。他寫完了作業之後就對著這些球發呆,這時候鄰居家的小朋友ion回來了,jason無聊之際想到了乙個遊戲。他把這n個小球從1到n進行標號。然後打亂順序,排成一排。然後讓ion進行一種操作 每次可以任意選擇乙個球,將其放到佇列的最前端或者...

動態規劃 最長上公升子串行LIS

一.簡單推論 非0 n情況 二.嚴謹推論 最長上公升子串行 lis 給定長度為n的序列,從中選取乙個子串行,這個子串行需要單調遞增 問最長上公升子串行 lis 的長度 eg 1,5,2,3,11,7,9 則lis序列為 1,2,3,7,9,長度為5 設計狀態dp x 為以a x 結尾的lis長度,那...