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 等人提出的,用來解決多階段決策過程問題的一種最優化方法。多階段決策過程是指把研究問題分成若干個相互聯絡的階段,由每個階段...