HDU 2845 Beans
阿新 • • 發佈:2018-12-22
分類
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]);
}
}