什麼是動態規劃呢?顧名思義,動態地進行規劃?讓我們先來看個小遊戲:
注:跳格仔的方案與順序有關,比如先跳一格,再跳兩格和先跳兩格,再跳一格是不同種方案。
資料範圍**:**2<=n<=60; 2<=k<=n
遞推寫法:
#include
intmain()
for(
int i=k;i<=n;i++
)printf
("%d\n"
,dp[n]);
return0;
}
說完了遞推寫法,我們再來說說遞迴寫法,遞迴的乙個特點就是在過程中會呼叫自身,我們給上**:
#include
int n,k;
//n表示跳到第n格有多少種方案,k表示每次可以跳一格或者k格
intsearch
(int n)
intmain()
看上去似乎也很簡單,但其實隱藏了乙個很大的「危機」,即使本題的資料範圍較小,但還是很容易出現超時的情況,為什麼小小的資料會產生超時呢?我們舉個菲波那切數列的例子:
#include
int n,k,dp[
100]
;//n表示跳到第n格有多少種方案,k表示每次可以跳一格或者k格
intsearch
(int n)
intmain()
動態規劃是一種通過拆分問題(發掘問題子結構),定義問題的狀態(可理解為一單值函式)以及狀態轉移方程使問題能夠通過遞推(或遞迴等)的方式化為簡單的問題(初值/邊界條件)被解決的演算法。
需要滿足無後效性,比如說本題的狀態方程,一旦dp[i-1]和dp[i-k]為求dp[i]服務完後,就不能對後續的資料再產生影響了。
問題具有最優子結構性質,這樣才能化為子問題進行解題。
狀態在複雜問題中,狀態可能不是單變數定義,需要用到多維陣列,如複雜的揹包問題
狀態轉移方程
狀態轉移方程不僅僅只有四則運算,可能會有積分號,求最大最小,等一系列奇奇怪怪的符號,不方便找
**實現
在oj上要考慮程式的執行速度,記憶體等問題,在用**表示自己的思路時可能會出現「我的大腦明白了,但**表達不了我的情感」的情況。
動態規劃入門 DP基礎
1,include using namespace std int main int solve int i,int j int main float p,pj,q,qj int n,mj float dp 5000 int main dp 0 1 for int i 1 i n i for int...
動態規劃基礎
to find the fastest way through a factory.這個問題我簡述下 乙個產品的出場要經過多道工序的加工方可出場。某工廠有兩條工作線,每條工作線都具有n道工序。並且對應位置的工序執行相同的操作,但是他們具有不同的時間代價。在同一條工作線當中,由當前工序轉移到下一道工序...
動態規劃(基礎)
1 揹包 2 最長上公升子串行 3 線性dp 區間dp 4 記錄結果再利用的動態規劃 5 狀態壓縮dp 1 2 3 hdu dp題集 1 揹包問題 1 演算法 01 揹包問題,畫 2 挑戰程式設計競賽 3 揹包九講 4 揹包九講 自學筆記 1 完全揹包自學筆記 題目一覽表 考察知識點 完成時間 a ...