1. 程式人生 > >HDU 2845 Beans

HDU 2845 Beans

分類

HDU 動態規劃 貪心

題意


在圖中取數,例如取了81之後,同一行的相鄰兩個不能取,還有81的上面那行和下面那行也不能取,問能取到的最大和是多少

想法

**dp的經典題目就是說這種選數的題,慢慢發現,dp的原則:處理子問題,根據子問題的最優解慢慢求得總的最優解,這個題目就是,先求我選一行中數的最大和,再求前i行的最大和,一直到n+1行得出來的不就是整個矩陣的最優解了 ----> dp思路 **
先求某一行能獲得的最大值,然後求所有行能獲得的最大值.

程式碼

312ms

/**
 * Author: GatesMa
 * Email: [email protected]
* Todo: ACM Training * Date:2018/11/18 */
#include <bits/stdc++.h> using namespace std; const int maxn = 222222; int dpx[maxn],dpy[maxn];//dpx[i]用來存當前這一行取前i個數的最大值,dpy[i]用來存前i行可得最大值 int n ,m, tem; /** dp的經典題目就是說這種選數的題,慢慢發現,dp的原則:處理子問題,根據子問題的最優解慢慢 求得總的最優解,這個題目就是,先求我選一行中數的最大和,再求前i行的最大和,一直到n+1行 得出來的不就是整個矩陣的最優解了 ----> dp思路 */
int main() { while(cin >> n >> m) { memset(dpx, 0, sizeof(dpx)); memset(dpy, 0, sizeof(dpy)); for(int i=2;i<=n+1;i++) { for(int j=2;j <= m+1;j++) { scanf("%d",&tem); dpx[j] = max(dpx[j-1], tem + dpx[j-2]);//當前這行前j列能獲得的最大值. } dpy[i] = max(dpy[i-1], dpy[
i-2] + dpx[m + 1]);//前i行最大能獲得的最大值. } printf("%d\n",dpy[n + 1]); } }