博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA1366-----Martian Mining------DP
阅读量:5235 次
发布时间:2019-06-14

本文共 1553 字,大约阅读时间需要 5 分钟。

本文出自:

题目地址:

题目地址:

给你一个N*M的地图,每个点都有A矿和B矿

A矿只能从左边往右边运输,B矿只能从上往下运输,中间不能拐弯,也不能间断

问你最多能采集的A和B之和

解题思路:

从题目可以发现如果在节点(i,j)上运输A的话,那么第i行的第1~j列只能运输A

同理,如果运输B的话,那么第j列的第1~i行只能运输B

给出状态表达式

定义:dp[i][j][0]表示如果在(i,j)上运输A的话的总和

dp[i][j][1]表示B的

那么转移方程就为:

dp[i][j][0] = max(dp[i-1][j][0],dp[i-1][j][1])+第i行第1~j列的A之和

dp[i][j][1] = max(dp[i][j-1][0],dp[i][j-1][1])+第j列第1~i行的B之和

行的和或者列的和预处理一下

最后的最优值就是max(dp[n][m][0],dp[n][m][1])

代码:

 

#include
#include
#include
#include
using namespace std;const int maxn = 510;int dp[maxn][maxn][2];int sum1[maxn][maxn];int sum2[maxn][maxn];int main(){ int n,m; while(~scanf("%d%d",&n,&m) && n+m) { memset(dp,0,sizeof(dp)); memset(sum1,0,sizeof(sum1)); memset(sum2,0,sizeof(sum2)); int tmp; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&tmp); sum1[i][j] = sum1[i][j-1]+tmp; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&tmp); sum2[i][j] = sum2[i-1][j]+tmp; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { dp[i][j][0] = max(dp[i-1][j][0],dp[i-1][j][1])+sum1[i][j]; dp[i][j][1] = max(dp[i][j-1][0],dp[i][j-1][1])+sum2[i][j]; } } printf("%d\n",max(dp[n][m][0],dp[n][m][1])); } return 0;}

 

 

转载于:https://www.cnblogs.com/pangblog/p/3285496.html

你可能感兴趣的文章
python基础2
查看>>
No.1110_第十一次团队会议
查看>>
图解 & 深入浅出 JavaWeb:Servlet必会必知
查看>>
20155201 2016-2017-2 《Java程序设计》第八周学习总结
查看>>
django-orm操作
查看>>
VS2010 MFC中 窗口分割的实现
查看>>
POJ1753 Flip Games
查看>>
chm文件转换成html文件,解决chm文件无法使用浏览器打开的问题
查看>>
poj 2955(区间dp)
查看>>
一个非常有用的算法---统计二进制数中1的个数
查看>>
Linux命令学习之路——变更文档拥有者:chown
查看>>
js--数据类型 类型转换
查看>>
Ubuntu下tomcat的安装
查看>>
弹出页面第一次加载可以生成table和方法的绑定,第二次点击进来不能生成table和方法的帮定...
查看>>
javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)...
查看>>
微信Web开发者工具报错:net::ERR_BLOCKED_BY_CLIENT
查看>>
个人学习与临界知识(一)
查看>>
火狐浏览器中event不起作用解决办法--记录(一)
查看>>
leetcode 493. Reverse Pairs
查看>>
HDU 2899 Strange fuction
查看>>