Codeforces Round #245 (Div. 1) B. Working out dp
题目链接:
http://codeforces.com/contest/429/problem/B
B. Working out
time limit per test2 secondsmemory limit per test256 megabytes
#### 问题描述
> Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the beach. The gym where they go is a matrix a with n lines and m columns. Let number a[i][j] represents the calories burned by performing workout at the cell of gym in the i-th line and the j-th column.
>
> Iahub starts with workout located at line 1 and column 1. He needs to finish with workout a[n][m]. After finishing workout a[i][j], he can go to workout a[i + 1][j] or a[i][j + 1]. Similarly, Iahubina starts with workout a[n][1] and she needs to finish with workout a[1][m]. After finishing workout from cell a[i][j], she goes to either a[i][j + 1] or a[i - 1][j].
>
> There is one additional condition for their training. They have to meet in exactly one cell of gym. At that cell, none of them will work out. They will talk about fast exponentiation (pretty odd small talk) and then both of them will move to the next workout.
>
> If a workout was done by either Iahub or Iahubina, it counts as total gain. Please plan a workout for Iahub and Iahubina such as total gain to be as big as possible. Note, that Iahub and Iahubina can perform workouts with different speed, so the number of cells that they use to reach meet cell may differs.
#### 输入
> The first line of the input contains two integers n and m (3 ≤ n, m ≤ 1000). Each of the next n lines contains m integers: j-th number from i-th line denotes element a[i][j] (0 ≤ a[i][j] ≤ 105).
#### 输出
> The output contains a single number — the maximum total gain possible.
#### 样例
> **sample input**
> 3 3
> 100 100 100
> 100 1 100
> 100 100 100
>
> **sample output**
> 800
题意
每个点有a[i][j]的物品(非负数),现在有一个人要从(1,1)到(n,m),且只能往下或者往右走,另一个人从(n,1)->(1,m),且只能往上或往右走,现在要让这两个人的路线有且只有一个公共点(且公共点的物品谁都不能取),问如何规划使得两个人能够获得的物品总数最多。
题解
这题比较特殊的地方在公共点,从公共点(x,y)出发,你会发现我们把原问题划分成了四个简单的子问题:(1,1)->(x,y),(n,1)->(x,y),(n,m)->(x,y),(1,m)->(x,y),但是你发现枚举这个点是不够的,还需要枚举这个点的上下左右四个点(既如何安排这两个人进入x,y的入口,使得刚好能够只有(x,y)这一个公共点)
代码
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf
typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8;
const double PI = acos(-1.0);
//start----------------------------------------------------------------------
const int maxn=1e3+10;
int arr[maxn][maxn];
int dp[4][maxn][maxn];
int n,m;
void init(){
clr(dp,0);
}
int main() {
scf("%d%d",&n,&m);
init();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scf("%d",&arr[i][j]);
}
}
//(1,1)->(n,m)
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
dp[0][i][j]=max(dp[0][i-1][j],dp[0][i][j-1])+arr[i][j];
}
}
//(n,1)->(1,m)
for(int i=n;i>=1;i--){
for(int j=1;j<=m;j++){
dp[1][i][j]=max(dp[1][i][j-1],dp[1][i+1][j])+arr[i][j];
}
}
//(n,m)->(1,1)
for(int i=n;i>=1;i--){
for(int j=m;j>=1;j--){
dp[2][i][j]=max(dp[2][i+1][j],dp[2][i][j+1])+arr[i][j];
}
}
//(1,m)->(n,1)
for(int i=1;i<=n;i++){
for(int j=m;j>=1;j--){
dp[3][i][j]=max(dp[3][i-1][j],dp[3][i][j+1])+arr[i][j];
}
}
int ans=-1;
//枚举相遇点
for(int i=2;i<n;i++){
for(int j=2;j<m;j++){
ans=max(ans,dp[0][i-1][j]+dp[2][i+1][j]+dp[1][i][j-1]+dp[3][i][j+1]);
ans=max(ans,dp[0][i][j-1]+dp[2][i][j+1]+dp[1][i+1][j]+dp[3][i-1][j]);
}
}
printf("%d\n",ans);
return 0;
}
//end-----------------------------------------------------------------------
Codeforces Round #245 (Div. 1) B. Working out dp的更多相关文章
- Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)
题目链接:http://codeforces.com/contest/283/problem/B 思路: dp[now][flag]表示现在在位置now,flag表示是接下来要做的步骤,然后根据题意记 ...
- Codeforces Round #245 (Div. 1) 429D - Tricky Function 最近点对
D. Tricky Function Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 codeforces.com/problemset/problem/42 ...
- Codeforces Round #245 (Div. 1) B. Working out (简单DP)
题目链接:http://codeforces.com/problemset/problem/429/B 给你一个矩阵,一个人从(1, 1) ->(n, m),只能向下或者向右: 一个人从(n, ...
- Codeforces Round #245 (Div. 1) B. Working out (dp)
题目:http://codeforces.com/problemset/problem/429/B 第一个人初始位置在(1,1),他必须走到(n,m)只能往下或者往右 第二个人初始位置在(n,1),他 ...
- Codeforces Round #245 (Div. 2) C. Xor-tree DFS
C. Xor-tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/430/problem/C ...
- Codeforces Round #245 (Div. 2) B. Balls Game 并查集
B. Balls Game Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/430/problem ...
- Codeforces Round #245 (Div. 2) A. Points and Segments (easy) 贪心
A. Points and Segments (easy) Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/con ...
- Codeforces 429 B. Working out-dp( Codeforces Round #245 (Div. 1))
B. Working out time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- Codeforces Round #245 (Div. 2) B - Balls Game
暴利搜索即可 #include <iostream> #include <vector> #include <iostream> using namespace s ...
随机推荐
- 如何创建一个新的vue项目
一.cnpm安装 1.百度node官网,进入官网下载安装包安装好node环境 2.成功后打开cmd命令行工具,执行node-v命令,查看node版本号,如果能输出版本号说明安装成功 3.推荐使用淘宝 ...
- 创建Podfile,添加类库,中途添加库指令
前提是你电脑已经安装了CocoaPods 1.打开终端 2.进入你的工程目录 cd /Users/...../CocoaPodsDemo 3. 创建Pods文件 touch Podfile 新建 ...
- laravel Eloquent ORM联合查询出现Class not found,就算在Moel中存在这个类
今天发现一个坑,在处理Eloquent ORM的联合查询时,一直报错Class 'AdminGroup' not found ,可是我的项目中明明存在这个类,如下 这是我的模型类: 它们的控制器方法: ...
- svn文件管理
将VS2010工程提交给Git管理时需要哪些文件: *.h *.cpp *.sln *.vcxproj *.vcxproj.filters *.qrc以及Resources目录下的资源 ...
- Office 365部分安装及同时安装Visio的方法
From MWeb Win版本的Office 365安装包默认安装所有组件,没有选择的页面,在安装Office 365后再安装下载的Visio 2016专业版时,会显示计算机上已经安装了即插即用Off ...
- PTA基础编程题目集6-6求单链表结点的阶乘和(函数题)
本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 函数接口定义: int FactorialSum( List L ); 其中单链表List的定义 ...
- sed: unix与doc换行的转换
在Linux (Unix)平台下回车换行以\n表示 在Window平台下回车换行以\r\n表示 两者的差异导致了: 在window下看Linux的文本排版全乱 在Linux在看Window的文本则是存 ...
- 20155318 《Java程序设计》实验四 (Android程序设计)实验报告
20155318 <Java程序设计>实验四 (Android程序设计)实验报告 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android.组 ...
- 2016-2017-2 20155329 实验四 Android 开发
2016-2017-2 20155329 实验四 Android 开发 ## 任务一:Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBI ...
- 20155339 2016-2017-2 《Java程序设计》第3周学习总结
20155339 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 类与对象 1.定义类时使用class关键词再加名称,例如 class Cl ...