挑戰練習題 基礎的動態規劃演算法

2021-07-04 11:16:33 字數 1804 閱讀 3703

poj 3176 數塔 比較容易 每個數可以由他上面左邊和正上面的數轉化而來。

#include 

#include

#include

#include

using

namespace

std;

#define m 400

#define inf 0x3f3f3f3f

int dp[m][m];

int s[m][m];

int main()

}dp[0][0] = s[0][0];

for(int i = 1;i < n;i++)

}int ans = -inf;

for(int i = 0;i < n;i++)

ans = max(ans,dp[n-1][i]);

printf("%d\n",ans);

}return

0;}

poj 2229

這題想了好久沒找出狀態轉移的方程。。還轉化成二進位製看了一下還是沒有看出來。。dp要多加練習。。

定義dp[i]為 數i的方案數

對於奇數來說每乙個都跟小於他的第乙個偶數的方案一樣,這個很容易得知,因為每個奇數的方案都可以在他對應的偶數的方案中 後面加1.

偶數就要分兩種情況了。這裡沒有想到。。

1)如果首位是一的話,他必定有兩個1,也可以對應到之前奇數中,每個都在加1。其實也就是前乙個偶數加兩個1。

2)如果首位不是1的話,那就說明,這裡面就沒有1。全部都是由偶數組成的,這樣的話就可以將每乙個數都除以2,這樣每乙個都對應乙個i/2所對應的方案。(這裡沒有思考出來,可能感覺對於奇偶不是太敏感。要多加揣測每一種狀態與之前狀態的關係。。。看來只能多練習吧orz)

#include 

#include

#include

#include

using

namespace

std;

#define m 2000001

int dp[m];

int main()

int n;

while(scanf("%d",&n)==1)

return

0;}

poj 2385

對於這種有步數限制的應該將狀態的其中一維定義為步數。。感覺可以模擬到揹包問題上,揹包問題中定義狀態dp[i][j] 為第i個物品,容量為j時的最大價值。這裡可以定義dp[i][j]為第i秒走了j步時的最大接到數目。

每一秒分為兩種情況

1)走 dp[i][j] = dp[i-1][j-1]

2)不走 dp[i][j] = dp[i-1][j]

還要注意的是如果當前走到的樹是剛好在下落蘋果的樹就要加一,比如走了奇數步就會在2樹下。

方程 dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]) + judge(a[i],j);

#include 

#include

#include

#include

using

namespace

std;

#define m 10009

int dp[m][m];

int a[m];

int judge(int x,int y)

int main()

}printf("%d\n",*max_element(dp[t],dp[t]+w+1));

}return

0;}

動態規劃演算法

一 動態規劃演算法原理 將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來。了不去求解相同的子問題,引入乙個陣列,把所有子問題的解存於該陣列中,這就是動態規劃所採用的基本方法。動態規劃...

動態規劃演算法

動態規劃 通過把原問題分解為相對簡單的子問題來求解複雜問題。動態規劃常常適用於有重疊子問題和最優子結構性質的問題。演算法總體思想 演算法的基本步驟 演算法的基本要素 最優子結構 重疊子問題 備忘錄方法 問題描述 子串行 公共子串行 最長公共子串行 lcs 問題 問題分析 動態規劃求解lcs問題 最長...

動態規劃演算法

動態規劃演算法的思路 動態規劃法即 dynamic programming method dp 是系統分析中的種常用方法。動態規劃法是20世紀50年代由貝爾曼 r.bellman 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...