動態規劃 線性DP 1

2021-09-19 22:21:19 字數 2728 閱讀 7595

動態規劃演算法通常用於求解具有某種最優性質的問題。

那它和貪心有區別嗎?

當然有。不然叫動態規劃幹啥?

幼兒園英語老師:dp是啥?

小盆友:dog&peppa pig

英語老斯:恩恩!真聰明!

然而,你是小盆友嗎?

如果是

如果不是,

dp是d****** p*******的縮寫。

意思是動態規劃。

聰明的bolt告訴你:是dynamic programming的縮寫!!!

動態規劃注重表示狀態,轉移狀態

so講乙個栗子:

lis:

最長上公升子串行

這是線性動態規劃中最經典的栗子之一。

最長上公升子串行(longest increasing subsequence,lis),指乙個序列中最長的單調遞增的子串行。

注意不是子串,所以可以不相鄰。

比如說:

序列:3   2   1   4   6   8   7   9

它的lis是5

3   4   6   8   9

或3   4   6   7   9

或2   4   6   8   9

還有很多種情況。

於是我們珂以得出:

動態規劃的最優解,有不同的組合情況,但答案只有乙個。

所以,如果noip出了動態規劃的題目時,一般會叫你求值,而不是求情況。

這是好處!

but,有的老師不會好心,會給更多限制條件,使ans只有一種情況,那就更有難度了。

lis問題要用動態規劃做。

方法一:

這是乙個好理解的方法。

但是更好使耗時

不難看出,dp [ i ]就是第 i 個數的lis

那**怎麼實現的呢?

先別急,我們在舉個生活中的栗子。

老師要你算1+2+3+4+5+6+7+8+9=?時,你會算得45,

老師再問你1+2+3+4+5+6+7+8+9+10=?時,你是會用1+···+10,還是用之前算的45+10?

聰明人會用後面一種。

所以,我們根據這個方便的原理,發現我每次計算dp [ i ] 時,如果用到了前面的 dp 值,則會減少一定的計算量。

在我們每次列舉乙個數的dp值時,只要掃瞄在它前面比它小的數,那些比他小的數的dp值的最大值+1就是所求數的dp值

因為比所求數小的數的dp值表示它的lis,再來乙個比它大的數,大樹數的lis就等於小數的lis+1.

但由於小數的lis有大有小,我們又要求最長子序列,我們就要取最大值。

一番思考後,我們找到了狀態轉移方程,也就是動態規劃中最重要的東西:

對於每乙個 i ,我們列舉它前面的數 j,if (i > 它前面的數 j )   dp [ i ] = max ( dp [ i ] , dp [ j ] + 1 ) ;

這個演算法的時間複雜度是o(n^2)的,慎用。

code:

1

int n,a[1001]/*

用來存序列

*/,dp[1001]/*

dp值*/;//

陣列大小根據題目而定。

2 cin>>n;

3 dp[1]=1; //

1的dp值為1

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

5 cin>>a[i];

6for(int i=1;i<=n;i++)714

}15}16 cout注意要初始化dp [ 1 ] = 1.剩下的為 0.

還有另一種時間複雜度為 n log n 的lis演算法

看,栗子!

2   1   5   3   6   4   6   3 

在 dp 值相同的情況下,保留較小的數顯然更好。因為後面的數若能跟較大的數構成上公升子串行,也一定能能較小的數構成上公升子串行,反之則不一定。例如 a_3=5 與 a_4=3 的 dp 均為 2,但 a_6=4 不能與 a_3=5 構成上公升子串行,而可以和 a_4=3 構成上公升子串行。 因此,不同的 dp 值只需要存乙個對應的最小值,將這個最小值順序排列,他們一定是公升序(嚴格來說是不下降)的。 於是,借助二分查詢的方式,就可以很快查到更新的值,整體時間複雜度 o(nlogn)。

這個就是上面的乙個優化,也沒有太多可講的,自己打一遍**也就熟了。

code:

1const

int maxn=1e5+5;2

inta[maxn];

3intn;4

intdp[maxn];

5int ans=1;6

int find(int

x) 13

else16}

17return

l;18 }//

二分查詢

19int

main()

27else31}

32 printf("%d"

,ans);

33return0;

34 }

今天的分享就到這裡,我們下次見。

DP1線性動態規劃 題

例4 lcs 最長公共子串行 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列x 若另一串行z 是x的子串行,是指存在乙個嚴格遞增的下標序列 使得對於所有j 1,2,k有 例如,序列z 是序列x 的子串行,相應的遞增下標序列為 2,3,5,7 給定兩個序列x和y 當另一...

動態規劃 線性DP

線性dp 即線性動態規劃,不侷限於 線性時間複雜度 的一維動態規劃。與數學中的 線性空間 類似,如果乙個動態規劃演算法的 狀態 包含多個維度,但在每個維度上都具有 線性 變化的 階段 那麼該動態規劃演算法同樣稱為 線性dp 在這類問題中,需要計算的物件表現出明顯的維度以及有序性,每個狀態的求解直接構...

DP1 動態規劃概述

計數求最大值最小值 求存在性 確定狀態 簡單的說,就是解動態規劃時需要開乙個陣列,陣列的每個元素f i 或者f i j 代表什麼,類似解數學題中,xyz代表什麼一樣,具體分為下面兩個步驟 轉移方程 根據子問題定義直接得到 初始條件和邊界情況 初始條件一般都是a 0 a 1 這種,多看看邊界條件主要是...