關於動態規劃,過了一段時間,自己給自己做乙個小結.
給你一道題目:
題目題意:
乙個n*n的方格.
從(1,1)進去,從(n,n)出;
每乙個交叉點都有花生,每次只能是向下或者向右走。
讓你找出走過路線中能踩到的花生的數量最多是多少?
給出的資料分析:
驗證正確
思考:
傳統思考方式
要思考這個幾個東西,但自己總覺得沒那麼高的水平.(cai)
可行性 階段,決策,最優子結構,無後效性。
所以我決定找一種更合適我的方式去思考動態規劃這類問題:
每個人都有自己喜歡的和習慣,這才是我自己
從集合角度來考慮dp問題
對於合適自己的思考,我通常是將dp問題,化為乙個集合的角度去思考,比如下面:
這個是自己在做乙個問題的思考.
摘花生 表示的屬性是max
從(1,1)走到(i,j)的最大值
從(1, 1 ) 走到 (i , j)的所有路線的最大值
f(n,n)就是最大值
動態規劃
1.狀態表示
f[i][j] 集合 所有從(1,1)走到(i,j)的路線代表的值
屬性 :max /min/數量
2.狀態的計算
f[i,j] 整個集合,分而治之
最後一步是從是上面 過來的
最後一步是 從左邊過來的 max(左,上) max(f[i-1][j]+w[i][j] f[i][j-1]+w[i][j])
狀態的計算 ——集合的劃分
劃分原則:
1.不重複(有的時候並不需要,而有點時候是需要的)
2.不漏
很重要的劃分依據:「最後」:
#include
#define pb(a) push_back(a)
#define pf push_front
#define beg begin
#define rb rbegin0
#define re rend
#define nd cout
#define pi acos(-1.0)
#define maxn 0x3f3f3f3f
#define minn 0xc0c0c0c0
using
namespace std;
typedef
unsigned
long
long ull;
typedef
long
long ll;
const
int n=
1e3+15;
int n,m;
int dp[n]
[n];
int w[n]
[n];
intmain()
}for
(int i=
1; i<=n; i++)}
cout<
[m]<
}return0;
}
dp(動態規劃)思考
dp的核心思想是分治策略和表儲存。分治策略並非dp所獨有,很多演算法都運用了把問題拆解為子問題的做法,比如遞迴。表儲存應該是dp比較獨有的一種方式,通過儲存一些中間結果,可以避免重複計算,從而提公升程式執行的速度。def max length s1,s2 最大公共子串,用dp求解 max len,m...
動態規劃解決TSP問題
題目描述 某推銷員要從城市 v1 出發,訪問其它城市v2,v3,v6 各一次且僅一次,最後返回v1。d為各城市間的距離矩陣。問 該推銷員應如何選擇路線,才能使總的行程最短?int d node number node number 每個點之間距離的矩陣 int path 6 6 行表示走到第幾步,列...
動態規劃問題
思想 如果乙個問題是由交疊的子問題所構成,那麼我們就可以用動態規劃技術來解決它。一般來說,這樣的子問題出現在對給定問題求解的遞迴關係中。這個遞推關係包含了相 同問題的更小子問題的解。動態規劃法建議,與其對交疊子問題一次又一次的求解,不如把每個較小子問題只求解一次並把結果記錄在表中。例題 0 1揹包問...