拿到dp题我们就要想如何推方程


“最北边有bloggium的收集站,最西边有 yeyenum 的收集站。现在要你在这些格子上面安装向北或者向西的传送带(每个格子只能装一种)。”

这说明了什么,对于某一个点,是不是只能通过2种方式来获取这个点的值,一个是铺北的传送带,一个是铺西的传送带。然而,如果在这个点铺了传送带的话,说明整一行都会被铺,但由于后来的可以铺不同的传送带来获取该点的值,说明如果在这个点铺的话只会影响这个点的西边的点或北边的点。

综上所述,我们对于仍以一个点,需要考虑以什么形式来铺,然而会影响前面,所以我们要考虑用前缀和来维护

则可以十分轻松的推出方程
f[i][j]=max(f[i][j-1]+a[i][j],f[i-1][j]+b[i][j]);
其中a数组时i行j列向北的前缀和数组,b数组就是向西的

AC代码

 #include <cstdio>
#include <algorithm> #define MAXN 510 using namespace std; int f[MAXN][MAXN];
int a[MAXN][MAXN];
int b[MAXN][MAXN]; int n,m;
int temp=-; int main() {   while(scanf("%d%d",&n,&m)) {   if(n==||m==) break;   for(int i=;i<=n;i++)
  for(int j=;j<=m;j++) {
    scanf("%d",&temp);
    b[i][j]=b[i][j-]+temp;
  }   for(int i=;i<=n;i++)
  for(int j=;j<=m;j++) {
    scanf("%d",&temp);
30     a[i][j]=a[i-][j]+temp;
  }   temp=-;   for(int i=;i<=n;i++) {
    for(int j=;j<=m;j++) {
      f[i][j]=max(f[i][j-]+a[i][j],f[i-][j]+b[i][j]);
      temp=max(f[i][j],temp);
    }
  }   printf("%d\n",temp);
  }
  return ;
}

最新文章

  1. 解决 SpringBoot 没有主清单属性
  2. thinkphp缓存
  3. Unity5和WebGL移植指南的一些总结
  4. linux配置oracle11G监听及本地网络服务 及 数据库建库
  5. First Missing Positive
  6. ectouch第十一讲 之 ECTouch 菜单里如何添加文章链接
  7. CALayer实现遮罩效果
  8. android camera(四):camera 驱动 GT2005
  9. 图解数据结构树之AVL树
  10. Node.js V0.12新特性之性能优化
  11. Delphi的没落有三个原因(比较贴切)
  12. Python学习笔记(五)
  13. Docker 部署Gitlab
  14. Docker安装指定版本
  15. Servlet 3.0 规范(二)注解驱动和异步请求
  16. PID控制算法的C语音实现
  17. SRM479
  18. ORACLE查看数据库已安装补丁
  19. 解决java.lang.IllegalStateException: The application’s PagerAdapter changed the adapter’s content
  20. SOD范例

热门文章

  1. C#循环语句练习(三)
  2. Beta版是什么意思
  3. 《Netty权威指南》(一)简单的时间服务器P69
  4. H3C 基于ACL的包过滤技术
  5. vue v-for循环使用
  6. WPF 使用 Composition API 做高性能渲染
  7. activiti工作流引擎学习(二)
  8. linux PCI 接口
  9. node-sass安装报错
  10. PyCharm永久破解方法