1>問題具有最優子結構性質:如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質
2>無後效性當前的若干個狀態值一但確定,則此後過程的演變就之和這若干個狀態的值有關,和之前是採取哪種手段或經過那條路徑演變到當前的這個若干個狀態, 沒有關係。
2>子問題可重疊性序偶求解的問題太可是做若干個重疊子問題的逐層遞進,每個子問題的求解過程都構成乙個階段
1>找子問題
2>確定狀態
3>確定一些初始狀態(邊界狀態)的值
4>找出狀態轉移方程
1>遞迴型
優點:直觀,容易編寫
缺點:可能會會因為遞迴層數太深而導致爆棧,函式呼叫帶來額外時間開銷。無法使用滾動陣列節省空間。總體來說比遞推型慢。
2>遞推型
效率高,可能使用滾動陣列節省空間
**poj滑雪
大致意思就是讓我們找到能劃的最長的路線,一開始可能都以為是從最大的那個點開始劃但是並不是,比如最大的點周圍是1234,最多他都只能劃4的長度所以並不一定在最高的位置開始劃,所以所有點都有可能(當然除了最小的那個)。因為當他在某個點他的方向選擇有4種,我們可以聯想到深廣搜(很明顯的地圖),一下是廣搜的ac**。
#include
#include
#include
#include
#include
#include
using
namespace std;
intmax
(int p1,
int p2)
int a[
2111][
2111];
//地圖(或者說高度)
int dp[
2111][
2111];
//狀態
int h, w;
//行數列數
//移動方向
int mh[4]
=;int mw[4]
=;intbfs
(int ph,
int pw)
}return dp[ph]
[pw]
;//搜完之後返回dp狀態,讓他能在上面的if裡直接返回,節省時間
}int
main()
}int m_last =0;
//最長距離
for(
int i =
1; i <= h; i++)}
printf
("%d\n"
, m_last)
;return0;
}
動態規劃入門(以爬樓梯為例)
動態規劃 dynamic programming 是運籌學的乙個分支,是求解決策過程 decision process 最優化的數學方法。動態規劃演算法通常基於乙個遞推公式及乙個或多個初始狀態。當前子問題的解將由上一次子問題的解推出。要解決乙個給定的問題,我們需要解決其不同部分 即解決子問題 再合併...
動態規劃入門(dp)
dp的基本思想,是把大問題轉化成乙個個小問題,然後遞迴解決。所以本質思想的話還是遞迴。dp最重要的是要找到狀態轉移方程,也就是把大問題化解的過程。舉個例子 乙個數字金字塔 112 2332 2243 133 在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得路徑上所經過的數字之和最大。路徑上的每一...
動態規劃入門 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...