描述:https://www.luogu.com.cn/problem/P2380


首先分析一下,易知传送带一定是要么向上,要么向右。且一定摆满了整个矩阵。

所以我们设 f [ i ] [ j ]表示:除了从1,1到 i , j 这个矩形之外的所有地区能获得的最大矿数。

那么从上一个状态到这一个状态,有两种情况:

①从f [ i ] [ j+1 ] 的状态,在1,j+1到i,j+1铺设一条传送带。

②从f [ i+1 ] [ j ] 的状态,在i+1,1到 i+1 , j 铺设一条传送带。

所以这两种情况的最大值就是f [ i ] [ j ] 的值。

考虑到每次都要求一段区间的和,我们可以分别维护两个横向,纵向的前缀和来优化。

至于为什么答案是 f [ 0 ] [ 0 ] ,因为即使枚举到了1,1代表的意思是除了1,1这个矩阵的收益

#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[][],b[][];
int hang[][],lie[][];
int dp[][];//定义除1,1到i,j矩阵,能获得的最大收益
int main()
{
while(cin>>n>>m&&(n+m))
{
memset(hang,,sizeof(hang));
memset(lie,,sizeof(lie));
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++) for(int j=;j<=m;j++) cin>>a[i][j];
for(int i=;i<=n;i++) for(int j=;j<=m;j++) cin>>b[i][j];
for(int i=;i<=n;i++) for(int j=;j<=m;j++) hang[i][j]=hang[i][j-]+a[i][j];//预处理前缀和
for(int j=;j<=m;j++) for(int i=;i<=n;i++) lie[j][i]=lie[j][i-]+b[i][j];
for(int i=n;i>=;i--)
for(int j=m;j>=;j--)
dp[i][j]=max(dp[i+][j]+hang[i+][j],dp[i][j+]+lie[j+][i]);
cout<<dp[][]<<endl;
}
}

最新文章

  1. hduoj 1455 &amp;&amp; uva 243 E - Sticks
  2. Realitymining 数据集简单介绍与使用
  3. git push.default is unset
  4. Java String 一些实验
  5. Java:IO流之字符流Reader、Writer详解
  6. Web- 一些标签样式
  7. 飘逸的python - 使用dis模块进行代码层次的性能剖析
  8. LA 3882
  9. nest &#39;for&#39; loop.
  10. Smarty3配置及入门语法
  11. CentOS7.3利用kubeadm安装kubernetes1.7.3完整版(官方文档填坑篇)
  12. rocketmq番外篇(一):开发命令行
  13. 不容易系列之一(hdu1465)错排+递推
  14. Git使用四:查看工作状态和历史提交
  15. mac 互传文件
  16. 洛谷P2949 工作调度Work Scheduling [USACO09OPEN] 贪心
  17. pgm16
  18. Jmeter的使用简介及实例
  19. select标签(下拉菜单和列表)
  20. cell设置背景颜色为啥不起作用

热门文章

  1. animation-play-state 在 ios 中不生效的解决办法(JS篇)
  2. 别人用钱,而我用python爬虫爬取了一年的4K高清壁纸
  3. 格式化启动盘win10
  4. 今天我们来讨论一下CSS3属性中的transition属性;
  5. PHP 常用数组的具体运用?常用吗?
  6. 线程Event
  7. 大数据并行计算框架Spark
  8. DBeaver数据表的拷贝过程
  9. 5. 配置项:rule_files
  10. js前端加密,php后端解密(crypto-js,openssl_decrypt)