本文出自   http://blog.csdn.net/shuangde800

题目链接: 点击打开链接

题目大意

给出n*m网格中每个格子的A矿和B矿数量,A矿必须由右向左运输,B矿必须由下向上运输,管子不能拐弯或者间断。要求收集到的A,B矿总量尽量大。

思路

由题意可知,如果格子(i,j)上选择运输A矿的话,那么i行的1~j就要全部选择A矿。

同理,如果选择B矿,那么第j列上的1~i行要全部选择B矿

所以推出下面的状态转移方程式:

f[i][j][0]表示第i行第j列为右下角顶点的矩形区域内,格子(i,j)上选择运输A矿情况下的最大总和
f[i][j][1]表示第i行第j列为右下角顶点的矩形区域内,格子(i,j)上选择运输B矿情况下的最大总和

那么
f[i][j][0] = max(f[i-1][j][0], f[i-1][j][1]) + sum{第i行的1~j列的A矿之和}
f[i][j][1] = max(f[i][j-1][0], f[i][j-1][1]) + sum{第j列的1~j行的B矿之和};
最终答案是max{f[n][m][0], f[n][m][1]}

代码:

/**==========================================*   This is a solution for ACM/ICPC problem**   @problem: UVA 1366 - Martian Mining*   @type:  dp*   @author: shuangde*   @blog: blog.csdn.net/shuangde800*   @email: zengshuangde@gmail.com*===========================================*/#include#include#include#include#include#include #include using namespace std; typedef long long int64; const int INF = 0x3f3f3f3f; const double PI = acos(-1.0); const int MAXN = 130; int m, n; int A[510][510], B[510][510]; int sum_row[510][510], sum_col[510][510]; int f[510][510][2]; int main(){ while(~scanf("%d%d", &n, &m) && n+m){ memset(sum_row, 0, sizeof(sum_row)); memset(sum_col, 0, sizeof(sum_col)); for(int i=1; i<=n; ++i) for(int j=1; j<=m; ++j){ scanf("%d", &A[i][j]); sum_row[i][j] = sum_row[i][j-1]+A[i][j]; } for(int i=1; i<=n; ++i) for(int j=1; j<=m; ++j){ scanf("%d", &B[i][j]); sum_col[i][j] = sum_col[i-1][j]+B[i][j]; } memset(f, 0, sizeof(f)); for(int i=1; i<=n; ++i) for(int j=1; j<=m; ++j){ f[i][j][0] = max(f[i-1][j][0], f[i-1][j][1]) + sum_row[i][j]; f[i][j][1] = max(f[i][j-1][0], f[i][j-1][1]) + sum_col[i][j]; } printf("%d\n", max(f[n][m][0], f[n][m][1])); } return 0; } 

UVa 1366 - Martian Mining (dp)相关推荐

  1. uva 1366 - Martian Mining(dp)

    题目链接:uva 1366 - Martian Mining 题目大意:给出n和m,然后给出两种矿的分布,a种只能向上运输,b中只能向下运输,问说最多可以得到多少. 解题思路:dp[i][j]表示矩阵 ...

  2. UVA 1366 Martian Mining DP

    为了方便,记从右到左运输的为A矿,从下到上运输的为B矿. 首先,假如我们在第i行的前k格架了运输管道运输这K个格子的A矿,那么对于i下面的其他行最少都能架上k格管子,因为不架也是浪费,这一片区域的B矿 ...

  3. 递推DP UVA 1366 Martian Mining

    题目传送门 1 /* 2 题意:抽象一点就是给两个矩阵,重叠的(就是两者选择其一),两种铺路:从右到左和从下到上,中途不能转弯, 3 到达边界后把沿途路上的权值相加求和使最大 4 DP:这是道递推题, ...

  4. UVA - 1366 Martian Mining

    问题 https://vjudge.net/problem/UVA-1366 分析 递推DP,dp[i][j]表示右下角坐标[i,j]的矩形能够运出最多的矿物是多少 状态转移: dp[i][j]=ma ...

  5. poj 2948 Martian Mining (dp)

    http://poj.org/problem?id=2948 意:一个row*col的矩阵,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是多少.如图所示,最北边有 ...

  6. UVA 116 Unidirectional TSP DP

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&p ...

  7. UVA 1331 Minimax Triangulation DP, 三角剖分

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  8. uva 10453 - Make Palindrome(dp)

    题目链接:10453 - Make Palindrome 题目大意:给出一个字符串,通过插入字符使得原字符串变成一个回文串,要求插入的字符个数最小,并且输出最后生成的回文串. 解题思路:和uva 10 ...

  9. UVA 1625 Color Length DP

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

最新文章

  1. 扩增子分析解读4去嵌合体,非细菌序列,生成代表性序列和OTU表
  2. [ARM异常]-ARMV8的异步异常(中断)详细介绍
  3. SNAT和DNAT的区别
  4. vue项目使用npm run dev 编译到一半不动了
  5. P2605 [ZJOI2010]基站选址
  6. ImageLoader实现图片异步加载
  7. 从一线技术人员到阿里合伙人,主导了去“IOE”,没有他,阿里只能给美国公司打工!...
  8. java 分层领域模型_Java领域模型 | 学步园
  9. 破局:滚动率知识在信贷风控中的系统总结
  10. 杨辉三角形(简明易懂)
  11. org.springframework.web.context.ContextLoaderListener 解决方案
  12. verilog实现四位全加器(基于一位全加器)
  13. java怎么判断素数_java判断是否为素数(质数)的方法
  14. 我的世界启动时要Java_我的世界启动时Java出现日志怎么办
  15. Oracle客户端使用
  16. circos 可视化手册-links 篇
  17. 大数据运维工程师 base 上海
  18. VS无法打开项目文件“Web.csproj” -此安装不支持该项目类型问题解决方案
  19. linux 虚拟机不是全屏显示,Linux系统在虚拟机VirtualBox不能全屏解决办法
  20. Zero-Shot Learing与Attention Machinism

热门文章

  1. 学会批处理 用心学很容易
  2. 简单分页,无需插件 实现 上一页|下一页 分页功能
  3. 一款轻便易用的物联网组态软件
  4. vue项目引入第三方地图插件并且随机显示坐标点(经纬度),点击坐标点弹出窗口,点击详情文字链接到其他模块
  5. Java之BufferedReader
  6. APOLLO安装教程
  7. Google总部员工的“腐败”生活(图组) 25岁华为员工之死
  8. Visual Studio Code使用中CPU占用率异常暴增过高原因
  9. java项目---全民飞机大战小游戏
  10. Rman 中的 2 个小小的需要注意的地方