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

2021-10-02 15:42:20 字數 2539 閱讀 3279

acwing 895. 最長上公升子串行

這是一道典型的dp例題, dp的兩個重要元素:狀態表示和狀態計算。其中維度的選擇是很關鍵的,要求既能夠表示出轉移過程中的狀態,而且能夠計算出結果,在此基礎上,要求維度盡可能小。

我們這裡可以用dp[i]來表示以第i個數結尾的數值上公升的子串行的集合,屬性是max;那麼對於狀態轉移的話,我們可以這樣考慮:每乙個上公升子串行以倒數第二個數選什麼來分類。可以有以下情況,dp[i-1]=0(即當前是第乙個數),a[k] (k=0,1,……i-1); 要注意這裡面並不是每乙個狀態都存在,我們只需要把存在的狀態進行轉移就可。

狀態轉移方程還是很好推的,我們記這個狀態可以由上乙個狀態 j 轉移過來,那麼本狀態的max就等於 j 狀態的max+1(本次狀態的長度) 。如下:

dp[i]=dp[j]+1;
結合上面兩部分,整個轉移方程也很容易寫出來啦

for(int j=1;j最後,一定要記得給dp賦初值呀!

完整**如下:

#includeusing namespace std;

typedef long long ll;

const int maxn=1e6+7;

ll dp[maxn],n,a[maxn];

int main() , 如果乙個數能接到3的後面,也就能接到1的後面~對,就是這樣!那麼既然這樣的話,第乙個子串行就沒有存在的意義啦(好殘忍)。 因為接到1的後面更優。

簡單總結就是,對於每一組相同長度的上公升子串行,我們可以只記錄a[i]最小的那一組,保證最優解和高效性。

同樣的,我們儲存一下不同長度下最小的結尾值,我們會發現結尾值和長度是正相關的。基於此性質,可以用單調佇列來優化此dp。

假如陣列f現在存了數,當到了陣列a的第i個位置時,首先判斷a[i] > f[cnt] ? 若是大於則直接將這個數新增到陣列f中,即f[++cnt] = a[i];這個操作時顯然的。

當a[i] <= f[cnt] 的時,我們就用a[i]去替代陣列f中的第乙個大於等於a[i]的數,因為在整個過程中我們維護的陣列f 是乙個遞增的陣列,所以我們可以用二分查詢在 logn 的時間複雜的的情況下直接找到對應的位置,然後替換,即f[l] = a[i]。

好了**如下

#includeusing namespace std;

const int maxn=1e6+7;

int q[maxn],a[maxn],n,cnt;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}inline int find(int x)

return l;

}int main()

}printf("%d\n",cnt);

return 0;

}

1017. 怪盜基德的滑翔翼 - acwing題庫

思路:當確定完起點後,就轉化成了在兩個方向上分別求解lis問題;

**:

#includeusing namespace std;

const int maxn=110;

int a[maxn],dp[maxn];

int main()a[maxn];

int dp[maxn],n;

bool cmp(node a,node b)

cout<1016. 最大上公升子串行和 - acwing題庫

思路:跟lis類似的,只不過初始化要變為a[i],轉移方程為

dp[i]=max(dp[i],dp[j]+a[i]);

**:

#includeusing namespace std;

const int maxn=1100;

int a[maxn],dp[maxn];

int main()

cout<187. 飛彈防禦系統 - acwing題庫

272. 最長公共上公升子串行 - acwing題庫

#include#define cutele main

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}const int maxn=1100;

char a[maxn],b[maxn];

int dp[maxn][maxn],n,m;

int cutele()

printf("%d\n",dp[n][m]);

return 0;

}

參考部落格:acwing 896. 最長上公升子串行 ii - acwing

acwing 1012. 友好城市 - acwing

動態規劃 最長上公升子串行 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長度,那...