動態規劃
遞迴寫法
以斐波那契舉例
若直接暴力求解,時間複雜度為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 級台階,也可以一...
五大經典演算法之回溯法
回溯法,又稱為試探法,按選優條件向前不斷搜尋,以達到目標。但是當探索到某一步時,如果發現原先選擇並不優或達不到目標,就會退回一步重新選擇,這種達不到目的就退回再走的演算法稱為回溯法。與窮舉法的區別和聯絡 相同點 它們都是基於試探的。區別 窮舉法要將乙個解的各個部分全部生成後,才檢查是否滿足條件,若不...