LightOJ1036 A Refining Company(DP)
2016-07-11 10:08
253 查看
题目大概说有一个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])
首先明确要运送某一格子的镭矿到北面加工厂,这个轨道肯定是直直连续往上的;而铀矿同理,是水平连续向左的轨道。
另外,因为获得的数量要最多,各个格子肯定都要铺设轨道,反证可知。
然后可以发现,格子(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[555][555],R[555][555],d[2][555][555]; int main(){ int t,n,m; scanf("%d",&t); for(int cse=1; cse<=t; ++cse){ scanf("%d%d",&n,&m); for(int i=0; i<n; ++i){ for(int j=0; j<m; ++j){ scanf("%d",&U[i][j]); } } for(int i=0; i<n; ++i){ for(int j=0; j<m; ++j){ scanf("%d",&R[i][j]); } } memset(d,0,sizeof(d)); d[0][0][0]=U[0][0]; d[1][0][0]=R[0][0]; for(int i=0; i<n; ++i){ for(int j=0; j<m; ++j){ if(i==0 && j==0) continue; if(i==0){ int sum=0; for(int k=0; k<=j; ++k){ sum+=U[i][k]; } d[0][i][j]=sum; d[1][i][j]=max(d[0][i][j-1],d[1][i][j-1])+R[i][j]; }else if(j==0){ d[0][i][0]=max(d[0][i-1][0],d[1][i-1][0])+U[i][j]; int sum=0; for(int k=0; k<=i; ++k){ sum+=R[k][j]; } d[1][i][j]=sum; }else{ int sum=0; for(int k=0; k<=j; ++k){ sum+=U[i][k]; } d[0][i][j]=max(d[0][i-1][j],d[1][i-1][j])+sum; sum=0; for(int k=0; k<=i; ++k){ sum+=R[k][j]; } d[1][i][j]=max(d[0][i][j-1],d[1][i][j-1])+sum; } } } printf("Case %d: %d\n",cse,max(d[0][n-1][m-1],d[1][n-1][m-1])); } return 0; }
相关文章推荐
- delete all untracked files
- 11个最值得Java开发者收藏的网站
- ViewPager或Fragment中使用Fragment(二)
- 第四届河南省程序设计大赛-表达式求值,双栈过!
- oracle 12c:新特性-网格(Grid)基础架构的增强
- 无法打开网站二级链接的解决办法
- Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: invalid drawable tag vec
- 交流
- 排序算法
- IAR FOR STM8S 错误 An error occurred while retrieving GDI features: gdi-error [40201]解决方法
- 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】02-第一个C语言程序
- 不积跬步,无以至千里
- Bootstrap实现弹性搜索框
- resultTypes
- C 语言左右法则
- 理解JavaScript创建对象的不同模式
- 使用 Swift 在 iOS 10 中集成 Siri —— SiriKit 教程(Part 1)
- 阶乘的0
- iOS之UIImageView的contentMode详解
- 1.1 深度学习 基本概念