题目链接:http://codeforces.com/problemset/problem/429/B

题目大意:两个人(假设为A,B),打算健身,有N行M列个房间,每个房间能消耗Map[i][j]的卡路里,A起点为(1,1)要达到(n,m)点,且每次只能向右走一步或向下走一步,

B起点为(n,1),要达到(1,m),且每次只能向上走一步,或向右走一步。有要求A,B必须在某一个房间相遇一次,且A,B在该房间不再消耗卡路里,因为两人锻炼身体的速度不同,

所以在相遇时经过的房间数亦可能不相同。问两人合计最多消耗多少卡路里。

解题思路:

先预处理四个dp数组:

dp1[i][j]表示从(1,1)到(n,m)路程中,(1,1)到(i,j)的最优解

dp2[i][j]表示从(1,1)到(n,m)路程中,(i,j)到(n,m)的最优解

dp3[i][j]表示从(n,1)到(1,m)路程中,(n,1)到(i,j)的最优解

dp4[i][j]表示从(n,1)到(1,m)路程中,(i,j)到(1,m)最优解

由于两人只能相遇一次,若两人相遇则肯定会是以下两种情况(蓝色表示A可能经过的区域,红色表示B可能经过的区域,紫色为相遇点):

那么对应上图两种情况分别有:

t1=dp1[i][j-1]+dp2[i][j+1]+dp3[i+1][j]+dp4[i-1][j];//情况一

t2=dp1[i-1][j]+dp2[i+1][j]+dp3[i][j-1]+dp4[i][j+1];//情况二

所以我们只要枚举点(i,j)即可,注意1<i<n且1<j<n否则不符合上图的情况。

代码:

 #include<bits/stdc++.h>
#define lc(a) (a<<1)
#define rc(a) (a<<1|1)
#define MID(a,b) ((a+b)>>1)
#define fin(name) freopen(name,"r",stdin)
#define fout(name) freopen(name,"w",stdout)
#define clr(arr,val) memset(arr,val,sizeof(arr))
#define _for(i,start,end) for(int i=start;i<=end;i++)
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef long long LL;
const int N=1e3+;
const int INF=0x3f3f3f3f;
const double eps=1e-; int mp[N][N];
LL dp1[N][N],dp2[N][N],dp3[N][N],dp4[N][N]; int main(){
FAST_IO;
int n,m;
cin>>n>>m;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++)
cin>>mp[i][j];
}
//计算从(1,1)到(n,m)路程中,(1,1)到(i,j)的最优解
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
dp1[i][j]=max(dp1[i-][j],dp1[i][j-])+mp[i][j];
}
}
//计算从(1,1)到(n,m)路程中,(i,j)到(n,m)的最优解
for(int i=n;i>=;i--){
for(int j=m;j>=;j--){
dp2[i][j]=max(dp2[i+][j],dp2[i][j+])+mp[i][j];
}
}
//计算从(n,1)到(1,m)路程中,(n,1)到(i,j)的最优解
for(int i=n;i>=;i--){
for(int j=;j<=m;j++){
dp3[i][j]=max(dp3[i+][j],dp3[i][j-])+mp[i][j];
}
}
//计算从(n,1)到(1,m)路程中,(i,j)到(1,m)最优解
for(int i=;i<=n;i++){
for(int j=m;j>=;j--){
dp4[i][j]=max(dp4[i-][j],dp4[i][j+])+mp[i][j];
}
} LL ans=-;
//枚举相遇点,注意不能在边界相遇,因为这样两个人相遇肯定不止一次
for(int i=;i<n;i++){
for(int j=;j<m;j++){
LL t1=dp1[i][j-]+dp2[i][j+]+dp3[i+][j]+dp4[i-][j];//情况一
LL t2=dp1[i-][j]+dp2[i+][j]+dp3[i][j-]+dp4[i][j+];//情况二
ans=max(ans,max(t1,t2));
}
}
cout<<ans<<endl;
return ;
}

Codeforces 429B Working out(递推DP)的更多相关文章

  1. Code Force 429B Working out【递推dp】

    Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the ...

  2. 递推DP URAL 1167 Bicolored Horses

    题目传送门 题意:k个马棚,n条马,黑马1, 白马0,每个马棚unhappy指数:黑马数*白马数,问最小的unhappy值是多少分析:dp[i][j] 表示第i个马棚放j只马的最小unhappy值,状 ...

  3. 递推DP URAL 1017 Staircases

    题目传送门 /* 题意:给n块砖头,问能组成多少个楼梯,楼梯至少两层,且每层至少一块砖头,层与层之间数目不能相等! 递推DP:dp[i][j] 表示总共i块砖头,最后一列的砖头数是j块的方案数 状态转 ...

  4. 递推DP URAL 1260 Nudnik Photographer

    题目传送门 /* 递推DP: dp[i] 表示放i的方案数,最后累加前n-2的数字的方案数 */ #include <cstdio> #include <algorithm> ...

  5. 递推DP URAL 1353 Milliard Vasya's Function

    题目传送门 /* 题意:1~1e9的数字里,各个位数数字相加和为s的个数 递推DP:dp[i][j] 表示i位数字,当前数字和为j的个数 状态转移方程:dp[i][j] += dp[i-1][j-k] ...

  6. 递推DP URAL 1119 Metro

    题目传送门 /* 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 递推DP:仿照JayYe,处理的很巧妙,学习:) 好 ...

  7. 递推DP 赛码 1005 Game

    题目传送门 /* 递推DP:官方题解 令Fi,j代表剩下i个人时,若BrotherK的位置是1,那么位置为j的人是否可能获胜 转移的时候可以枚举当前轮指定的数是什么,那么就可以计算出当前位置j的人在剩 ...

  8. 递推DP HDOJ 5328 Problem Killer

    题目传送门 /* 递推DP: 如果a, b, c是等差数列,且b, c, d是等差数列,那么a, b, c, d是等差数列,等比数列同理 判断ai-2, ai-1, ai是否是等差(比)数列,能在O( ...

  9. hdu1978(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978 分析: 递推DP. dp[][]表示可以到达改点的方法数. 刚开始:外循环扫描所有点dp[x][ ...

  10. 递推DP URAL 1031 Railway Tickets

    题目传送门 /* 简单递推DP:读题烦!在区间内的都更新一遍,dp[]初始化INF 注意:s1与s2大小不一定,坑! 详细解释:http://blog.csdn.net/kk303/article/d ...

随机推荐

  1. 【数学】【P5150】 生日礼物

    Description 给定 \(n\),求 \[\sum_{i}~\sum_j~[lcm(i,j)~=~n]\] input 一行一个整数代表 \(n\) Output 一行一个整数代表答案 Hin ...

  2. C标准库函数--文件IO操作函数。

    C标准库文件读写函数总结:都是对文件流进行输入输出的函数分为对文件的有格式读写以及无格式读写 一.文件的无格式读写根据每次读写字符的数量,分为三类:1.按字符读写文件 按字符读有三个函数:以下三个函数 ...

  3. BZOJ 3160 FFT+马拉车

    题意显然 ans=回文子序列数目 - 回文子串数目 回文子串直接用马拉车跑出来 回文子序列一开始总是不知道怎么求 (太蠢了) 后面看了题解 构造一个神奇的卷积 (这个是我盗的图)地址 后面还有一些细节 ...

  4. 左值与右值,左值引用与右值引用(C++11)

    右值引用是解决语义支持提出的 这篇文章要介绍的内容和标题一致,关于C++ 11中的这几个特性网上介绍的文章很多,看了一些之后想把几个比较关键的点总结记录一下,文章比较长.给出了很多代码示例,都是编译运 ...

  5. HDU 3271 数位dp+二分

    SNIBB Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. Zabbix应用三:Zabbix监控MySQL

    利用Zabbix自带模版监控(Template App MySQL)MySQL服务 一.添加模版: 进入zabbix页面,找到'配置'->'主机'->'模版',点击'链接指示器'后面的'选 ...

  7. linux(ubuntu) 安装 node.js

    其实几个月之前我已经介绍过使用window版的nvm——wnvm了 1.先安装nvm 日常开发安装node通常会用nvm来安装,因为nvm可以帮我们管理好node的版本 我们通过git来把nvm下载到 ...

  8. 进化论VS中性突变理论

    进化论VS中性突变理论 查尔斯·罗伯特·达尔文(英语:CharlesRobert Darwin,1809年2月12日-1882年4月19日),英国生物学家,其“进化论”被列为19世纪自然科学的三大发现 ...

  9. Java并发编程原理与实战三:多线程与多进程的联系以及上下文切换所导致资源浪费问题

    一.进程 考虑一个场景:浏览器,网易云音乐以及notepad++ 三个软件只能顺序执行是怎样一种场景呢?另外,假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而 ...

  10. jquery如何获取input(file)控件上传的图片名称,即"11111.jpg"

    html代码:<input name=file" type="file" id="file"/> Jquery代码:var file;$( ...