LightOJ1036 A Refining Company(DP)
题目大概说有一个n*m的格子地图,每个格子有铀或者镭矿。地图最北面的镭矿加工厂,最西面有铀矿加工厂,而要通过在格子里铺设由南向北(镭)或由东向西(铀)的轨道来送矿物到加工厂。一个格子只能铺设一种轨道,即要嘛运送铀要嘛运送镭,不同轨道也不能相交。现在知道地图上各个格子铀和镭的数量,问怎么铺设轨道使送到加工厂的矿物数量最多。
- 首先明确要运送某一格子的镭矿到北面加工厂,这个轨道肯定是直直连续往上的;而铀矿同理,是水平连续向左的轨道。
- 另外,因为获得的数量要最多,各个格子肯定都要铺设轨道,反证可知。
- 然后可以发现,格子(i,j)怎样与格子(0,0)到格子(i-1,j-1)的围成的矩形所有格子的情况毫不相关,这样就考虑DP了:
- dp[0][i][j]表示格子(0,0)到格子(i,j)围成的矩形中,格子(i,j)铺设横轨道能获得的最大数量
- dp[1][i][j]表示格子(0,0)到格子(i,j)围成的矩形中,格子(i,j)铺设竖轨道能获得的最大数量
转移:
- dp[0][i][j]就是从max(dp[0][i-1][j],dp[1][i-1][j])+sum(格子(i,0)的铀数量...格子(i,j)的铀数量)
- dp[1][i][j]同理
- 而最后的结果就是max(dp[0][n-1][m-1],dp[1][n-1][m-1])
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int U[][],R[][],d[][][];
int main(){
int t,n,m;
scanf("%d",&t);
for(int cse=; cse<=t; ++cse){
scanf("%d%d",&n,&m);
for(int i=; i<n; ++i){
for(int j=; j<m; ++j){
scanf("%d",&U[i][j]);
}
}
for(int i=; i<n; ++i){
for(int j=; j<m; ++j){
scanf("%d",&R[i][j]);
}
}
memset(d,,sizeof(d));
d[][][]=U[][];
d[][][]=R[][];
for(int i=; i<n; ++i){
for(int j=; j<m; ++j){
if(i== && j==) continue;
if(i==){
int sum=;
for(int k=; k<=j; ++k){
sum+=U[i][k];
}
d[][i][j]=sum; d[][i][j]=max(d[][i][j-],d[][i][j-])+R[i][j];
}else if(j==){
d[][i][]=max(d[][i-][],d[][i-][])+U[i][j]; int sum=;
for(int k=; k<=i; ++k){
sum+=R[k][j];
}
d[][i][j]=sum;
}else{
int sum=;
for(int k=; k<=j; ++k){
sum+=U[i][k];
}
d[][i][j]=max(d[][i-][j],d[][i-][j])+sum; sum=;
for(int k=; k<=i; ++k){
sum+=R[k][j];
}
d[][i][j]=max(d[][i][j-],d[][i][j-])+sum;
}
}
}
printf("Case %d: %d\n",cse,max(d[][n-][m-],d[][n-][m-]));
}
return ;
}
LightOJ1036 A Refining Company(DP)的更多相关文章
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)
Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
- 最长公共子序列长度(dp)
/// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...
随机推荐
- August 31st 2016 Week 36th Tuesday
A friend without faults will never be found. 没有缺点的朋友是永远找不到的. You can't find a friends without faults ...
- Hadoop 2.5.2 eclipse plugin 编译 win7 集成
一.hadoop集群环境配置 参考我的前一篇文章(ubuntu + hadoop2.5.2分布式环境配置 http://www.cnblogs.com/huligong1234/p/4136331 ...
- UVA 10252
按照字典序输出最长公共子序列 #include<time.h> #include <cstdio> #include <iostream> #include< ...
- Visual Studio 推荐插件--高量,变量高量,语法高亮
1 WordLight for 2008 下载网址:http://visualstudiogallery.msdn.microsoft.com/ad686131-47d4-4c13-ada2-5b1 ...
- ubuntu 下使用 putty 调试
转自:http://blog.csdn.net/wh_19910525/article/details/39313457 Ubuntu的机子上,插上USB2COM线,准备开工. 检查USB2COM在本 ...
- 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)
1.内容观察者ContentObserver 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调 ...
- 【翻译十五】-java并发之固定对象与实例
Immutable Objects An object is considered immutable if its state cannot change after it is construct ...
- float 的有效数字为七位是怎么得出来的
以下内容来自CSDN网友xian_wwq的回答(http://bbs.csdn.net/topics/390874239): float: 1bit(符号位) 8bits(指数位) 23bits( ...
- MS SQL数据批量备份还原(适用于MS SQL 2005+) 分类: SQL Server 数据库 2015-03-10 14:32 103人阅读 评论(0) 收藏
我们知道通过Sql代理,可以实现数据库的定时备份功能:当数据库里的数据库很多时,备份一个数据库需要建立对应的定时作业,相对来说比较麻烦: 还好,微软自带的osql工具,比较实用,通过在命令行里里输入命 ...
- 怎样在linux下安装网卡驱动
由于我电脑的各种奇葩问题的存在,导致我装上Ubuntu13.10之后网卡居然无法使用,坚持了挺久使用无线网,终于坚持不住了,百度了各种解决方式,终于成功解决.这里也记录一下我的解决过程,供大家参考.大 ...