五大演算法之動態規劃 (經典問題)

2021-09-09 09:09:38 字數 1638 閱讀 3719

動態規劃

遞迴寫法

以斐波那契舉例

若直接暴力求解,時間複雜度為o(2^n)

// n為輸入的斐波那契數列第n項

intf

(int n)

遞迴寫法也稱為記憶化搜尋

// 設定dp陣列儲存

const

int maxn=

1000

;int dp[maxn]

;intf(

int n)

}

遞推寫法

int n;

//輸入資料

scanf

("%d"

,&n)

;for

(int i=

1;i<=n;

++i)

}// 邊界

for(

int i=n-

1;i>=i;

--i)

for(

int i=n-

1;i>=1;

--i)

}printf

("%d\n"

,dp[1]

[1])

;return0;

}//輸入樣例55

83127

164101169

5394

以下例子中:細節說明求解動態規劃的方法

1. 最大連續子串行和

給定乙個數字序列a1,a2,a3,…,求i,j(1<=i<=j<=n),使得ai+…a j(連續的)最大,輸出這個最大和

#include

#include

#include

using

namespace std;

const

int maxn=

10000+10

;int a[maxn]

,dp[maxn]

;int

main()

// 邊界

dp[0]

=a[0];

for(

int i=

1;i++i)

sort

(dp,dp+n)

; cout<

}//輸出示例51

2-45

3//輸出

8

2. 最長不下降子串行

在乙個數字序列中,找到乙個最長的子串行(可以不連續),使得這個子串行是下降的(非遞減的)

#include

#include

#include

using

namespace std;

const

int n=

100;

int a[n]

,dp[n]

;int

main()

int ans=0;

//記錄

for(

int i=

1;i<=n-1;

++i)

} ans=

max(ans,dp[i]);

} cout

}

五大經典演算法

據說有人歸納了計算機的五大常用演算法,它們是貪婪演算法,動態規劃演算法,分治演算法,回溯演算法以及分支限界演算法。雖然不知道為何要將這五個演算法歸為最常用的演算法,但是毫無疑問,這五個演算法是有很多應用場景的,最優化問題大多可以利用這些演算法解決。演算法的本質就是解決問題。當資料量比較小時,其實根本...

五大常規演算法 動態規劃法

它與分治演算法的思想相同,但是不同的點在於 分治演算法是,將大問題,分解成小問題,小問題解決了,合併解決大問題。動態規劃是,將大問題分解成小問題,將小問題解決後,將小問題的解,放到乙個容器中 比如陣列 這樣求解大問題的時候,就可以直接用,避免重複計算。例題 如果乙個人一次可以上 1 級台階,也可以一...

五大經典演算法之回溯法

回溯法,又稱為試探法,按選優條件向前不斷搜尋,以達到目標。但是當探索到某一步時,如果發現原先選擇並不優或達不到目標,就會退回一步重新選擇,這種達不到目的就退回再走的演算法稱為回溯法。與窮舉法的區別和聯絡 相同點 它們都是基於試探的。區別 窮舉法要將乙個解的各個部分全部生成後,才檢查是否滿足條件,若不...