Beans

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3521    Accepted Submission(s): 1681

Problem Description

Bean-eating is an interesting game, everyone owns an M*N matrix, which is filled with different qualities beans. Meantime, there is only one bean in any 1*1 grid. Now you want to eat the beans and collect
the qualities, but everyone must obey by the following rules: if you eat the bean at the coordinate(x, y), you can’t eat the beans anyway at the coordinates listed (if exiting): (x, y-1), (x, y+1), and the both rows whose abscissas are x-1 and x+1.






Now, how much qualities can you eat and then get ?

 

Input

There are a few cases. In each case, there are two integer M (row number) and N (column number). The next M lines each contain N integers, representing the qualities of the beans. We can make sure that
the quality of bean isn't beyond 1000, and 1<=M*N<=200000.
 

Output

For each case, you just output the MAX qualities you can eat and then get.
 

Sample Input

4 6
11 0 7 5 13 9
78 4 81 6 22 4
1 40 9 34 16 10
11 22 0 33 39 6
 

Sample Output

242
 

Source

2009 Multi-University Training Contest 4 -
Host by HDU




题目链接:

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

pid=2845



题目大意:在一个矩阵中选择一些数,要求和最大,假设选择(x,y)位置的数。则(x, y+1),(x,y-1)位置不可选。第x+1和第x-1行都不可选



题目分析:题目给了m*n的范围,就是不让你开二维开开心心切掉。只是不影响。一维照样做。先对于每一行dp一下,求出当前行能取得的最大值

tmp[j] = max(tmp[j - 1],a[i + j - 1] + tmp[j - 2])第一个表示不选第i行第j列得数字。第二个表示选,取最大,则最后tmp[m]为当前行最大的

然后由于相邻两行不能同一时候取,我再对行做一次dp

 dp[i] = max(dp[i - 1], dp[i - 2] + row[i]),第一个表示不选第i行,第二个表示选第i行,取最大,则最后dp[cnt - 1]即为答案

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 2 * 1e5 + 5;
int row[MAX], a[MAX], dp[MAX], tmp[MAX]; int main()
{
int n, m;
while(scanf("%d %d", &n, &m) != EOF)
{
memset(tmp, 0, sizeof(tmp));
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= m * n; i++)
scanf("%d", &a[i]);
int cnt = 1;
for(int i = 1; i <= m * n; i += m)
{
for(int j = 2; j <= m; j++)
{
tmp[1] = a[i];
tmp[j] = max(tmp[j - 1], a[i + j - 1] + tmp[j - 2]);
}
row[cnt ++] = tmp[m];
}
dp[1] = row[1];
for(int i = 2; i < cnt; i++)
dp[i] = max(dp[i - 1], dp[i - 2] + row[i]);
printf("%d\n", dp[cnt - 1]);
}
}

最新文章

  1. 使用nvm利器,管理node版本
  2. JSONModel对架构的影响及解决方案
  3. 【EasyUI】combotree和combobox模糊查询
  4. scrollview背景头部拉伸
  5. apply和call
  6. cocos2d-x之xml文件读取初试
  7. 快速了解AngularJs HTTP响应拦截器
  8. makefile学习笔记(多目录嵌套调用、变量使用)
  9. linux安装Eclipse c++环境
  10. Delphi中TApplication详解
  11. WebService客户端添加SOAPHeader信息
  12. Gitlab - Pull Request
  13. 拿Proxy可以做哪些有意思的事儿
  14. vbs脚本实现qq定时发消息(初级)
  15. Nginx proxy_protocol协议
  16. 在HTML中用循环语句
  17. text-transform CSS
  18. ThinkPHP5微信扫码支付
  19. 解决CentOS下无法发送邮件的问题
  20. 20145307陈俊达《网络对抗》Exp9 Web安全基础实践

热门文章

  1. C语言文件操作 FILE结构体
  2. c++ heap学习
  3. Spring注解@Component、@Repository、@Service、@Controller
  4. CF802D
  5. php 注册与登录
  6. 有关php启动时候报错信息
  7. BZOJ 2337 [HNOI2011]XOR和路径 ——期望DP
  8. BZOJ 4001 [TJOI2015]概率论 ——找规律
  9. 济南学习 Day 5 T3 am
  10. C/C++怎样传递二维数组,转载自CSDN