動態規劃 思考解決動態規劃問題

2021-10-23 02:30:49 字數 1747 閱讀 7581

關於動態規劃,過了一段時間,自己給自己做乙個小結.

給你一道題目:

題目題意:

乙個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揹包問...