最長不下降子串行問題

2021-07-27 03:51:10 字數 1453 閱讀 2450

前幾天看了關於動態規劃的內容,基本上講的都是最大不下降序列,所以第一次部落格

就寫這個東西了。

給出一系列的數,給出乙個整數,即最長不下降子串行(code vs 1567)

題解:先另創乙個陣列,用來記錄某乙個數到目前為止的最大長度,用for語句將所有元素遍歷

一遍就可以確定最長不下降子串行的長度了。

比如給出:21 22 63 15

從63開始(15不需要,其本身長度即為1),沒有元素比他大,故它的長度還是1,然後

是22,後面有乙個元素比它大,所以其長度為1+1(本身長度)=2,對於21尋找比它大的且長度

最大的元素,即22(長度為2),故該元素長度為3。此時遍歷完畢,最大值為3。

下面上**:

#include

#include

using

namespace

std;

int a[5000],dp[5000];

int main(void)

for(int i=2;i<=n;i++) //其實從前從後遍歷都一樣

}len=max(len,dp[i]);

}cout

<另解

可以另開乙個堆疊陣列stack,每次取棧頂的元素stack[top]和讀到的元素temp

比較,如果temp>top,則將temp壓入棧頂,如果temp

#include

#include

#include

using

namespace

std;

int main(void)

else

else

}stack[mid]=temp;

}}cout

}

關於這個最長不下降子串行有一道題:攔截飛彈(noip1999)

題解:

這題第一問其實就是最長不上公升子串行問題,之前有講,然後第二問其實就是問有

幾個最長不上公升子串行,這個要用乙個定理,書上寫的是:即乙個序列中不上公升

子串行的最小覆蓋數等於序列中最長上公升序列的長度。(這什麼鬼話,表示並沒有

看懂)其實說白了就是該問可以轉化為求最長不下降子串行的長度(至於為什麼

,因為前面那個沒有看懂的定理,反正用就好咯)

下面是**:

#include

#include

#include

#include

using

namespace

std;

int dp[5000],a[5000];

int main(void)

}memset(dp,0,sizeof(dp));

for(i=1;i<=n;i++)

最長不下降子串行問題

第一問 lis 求出 s 用正常的 o n 2 的演算法,後面有用 第二問首先動態規劃求出 f i 然後根據題意 最多可取出多少個長度為s的不下降子串行 說明子串行的起點一定在 i 當且僅當 f i s 終點在 j 當且僅當 f j 1 又因為這是網路流24題每個數只能被選一次,所以把每個數對應到點...

最長不下降子串行問題

題目建模很好 建模思路 byvoid dalao十年前的題解orz 問題分析 第一問是lis,動態規劃求解,第二問和第三問用網路最大流解決。建模方法 首先動態規劃求出f i 表示以第i位為開頭的最長上公升序列的長度,求出最長上公升序列長度k。1 把序列每位i拆成兩個點和,從到連線一條容量為1的有向邊...

最長不下降子串行

a1 t0 an a an 1 2 b an c d n 1 求該序列最長不下降子串行長度 n不是很大顯然可以暴力。n很大呢?那就不斷減迴圈節長度直至減到乙個閾值內,再暴力。正確性顯然,只要閾值不要設太小。include include include define fo i,a,b for i a...