HDOJ 2845 Beans DP

http://acm.hdu.edu.cn/showproblem.php?pid=2845

由于数据庞大,决不能直接DFS了,根据题目的特点,发现先对每一行DP,把每一行的最大值保存到

一个数组中,再对这个数组DP一下,双重DP,不过用的同一个DP公式,挺有意思的~~~

DP公式:dp[i]=max{dp[j](j<=i-2)}+w[i];

 
  
#include < iostream >
using namespace std;
// dp1[]用来求出每一行的最大值,将最大值存入dp[2]中
// 最后再对dp2[]DP,就可求得整体最大值
int dp1[ 200010 ],dp2[ 200010 ];
// 对dp[]数组dp,公式为dp[i]=max{dp[j](j<=i-2)}+w[i];
int dpMax( int dp[], int n){
int max = dp[ 1 ];
int temp;
for ( int i = 3 ;i <= n;i ++ ){ // 得从3开始,晕死,一开始错了!
temp = dp[ 1 ];
for ( int j = 1 ;j <= i - 2 ;j ++ )
if (dp[j] > temp)temp = dp[j];
dp[i]
= temp + dp[i];
if (dp[i] > max)max = dp[i];
}
return max;
}

int main(){
int m,n;
while (scanf( " %d%d " , & m, & n) != EOF){
for ( int i = 1 ;i <= m;i ++ ){
// 没输入一行求一次DP,并将最大值存入dp2[]中
for ( int j = 1 ;j <= n;j ++ )
scanf(
" %d " , & dp1[j]);
dp2[i]
= dpMax(dp1,n);
}
// 最后再对dp2[]DP,就可求得整体最大值
cout << dpMax(dp2,m) << endl;
}
return 0 ;
}

转载于:https://www.cnblogs.com/liushang0419/archive/2011/04/29/2032354.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值