Codeforces Round #131 (Div. 2) E. Relay Race dp
题目链接:
http://codeforces.com/problemset/problem/214/E
Relay Race
time limit per test4 secondsmemory limit per test256 megabytes
#### 问题描述
> Furik and Rubik take part in a relay race. The race will be set up on a large square with the side of n meters. The given square is split into n × n cells (represented as unit squares), each cell has some number.
>
> At the beginning of the race Furik stands in a cell with coordinates (1, 1), and Rubik stands in a cell with coordinates (n, n). Right after the start Furik runs towards Rubik, besides, if Furik stands at a cell with coordinates (i, j), then he can move to cell (i + 1, j) or (i, j + 1). After Furik reaches Rubik, Rubik starts running from cell with coordinates (n, n) to cell with coordinates (1, 1). If Rubik stands in cell (i, j), then he can move to cell (i - 1, j) or (i, j - 1). Neither Furik, nor Rubik are allowed to go beyond the boundaries of the field; if a player goes beyond the boundaries, he will be disqualified.
>
> To win the race, Furik and Rubik must earn as many points as possible. The number of points is the sum of numbers from the cells Furik and Rubik visited. Each cell counts only once in the sum.
>
> Print the maximum number of points Furik and Rubik can earn on the relay race.
#### 输入
> The first line contains a single integer (1 ≤ n ≤ 300). The next n lines contain n integers each: the j-th number on the i-th line ai, j ( - 1000 ≤ ai, j ≤ 1000) is the number written in the cell with coordinates (i, j).
#### 输出
> On a single line print a single number — the answer to the problem.
#### 样例
> **sample input**
> 3
> 25 16 25
> 12 18 19
> 11 13 8
>
> **sample output**
> 136
题意
给你一个n*n的网格,每个格子有一个数字,求从(1,1)到(n,n)的两条路线,使得经过的数字的和最大。(如果一个人经过了一个格子,下一个人再经过就只能得到0)
题解
看上去要开4维,其实开3维就能做的dp。
dp[k][i1][i2]表示两个人从(0,0)点出发走到第k个从对角线上(i1+j1k&&i2+j2k)一个在(i1,k-i1),一个在(i2,k-i2)上的最大值。
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef int LL;
const int maxn = 301;
const int INF = 0x3f3f3f3f;
int arr[maxn][maxn];
int n;
LL dp[maxn*2][maxn][maxn];
LL dfs(int k,int i1, int i2) {
if (dp[k][i1][i2]>-INF) return dp[k][i1][i2];
LL &res = dp[k][i1][i2];
int j1 = k - i1, j2 = k - i2;
//上上
if (i1 - 1 >= 0 && i2 - 1 >= 0) res = max(res, dfs(k - 1, i1 - 1, i2 - 1));
//上左
if (i1 - 1 >= 0 && j2 - 1 >= 0) res = max(res, dfs(k - 1, i1 - 1, i2));
//左上
if (j1 - 1 >= 0 && i2 - 1 >= 0) res = max(res, dfs(k - 1, i1, i2 - 1));
//左左
if (j1 - 1 >= 0 && j2 - 1 >= 0) res = max(res, dfs(k - 1, i1, i2));
//(i1 == i2 ? 0 : arr[i2][j2])一定要加括号!可能是res+影响的吧,不加会wa很惨orz
res += arr[i1][j1] + (i1 == i2 ? 0 : arr[i2][j2]);
}
int main() {
for (int i = 0; i < maxn * 2; i++) {
for (int j = 0; j < maxn; j++) {
for (int k = 0; k < maxn; k++) {
dp[i][j][k] = -INF;
}
}
}
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &arr[i][j]);
}
}
dp[0][0][0] = arr[0][0];
LL ans=dfs(2*n-2,n - 1, n - 1);
printf("%d\n", ans);
return 0;
}
Codeforces Round #131 (Div. 2) E. Relay Race dp的更多相关文章
- Codeforces Round #131 (Div. 2)
A. System of Equations \(a\)的范围在\(\sqrt n\)内,所以暴力枚举即可. B. Hometask 需要被2.5整除,所以末位必然为0,如果0没有出现,则直接返回-1 ...
- Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)
题目链接:http://codeforces.com/contest/283/problem/B 思路: dp[now][flag]表示现在在位置now,flag表示是接下来要做的步骤,然后根据题意记 ...
- Codeforces Round #346 (Div. 2) D Bicycle Race
D. Bicycle Race 题目链接http://codeforces.com/contest/659/problem/D Description Maria participates in a ...
- Codeforces Round #346 (Div. 2) D. Bicycle Race 叉积
D. Bicycle Race 题目连接: http://www.codeforces.com/contest/659/problem/D Description Maria participates ...
- Codeforces Round #131 (Div. 1) B. Numbers dp
题目链接: http://codeforces.com/problemset/problem/213/B B. Numbers time limit per test 2 secondsmemory ...
- Codeforces Round #131 (Div. 2) B. Hometask dp
题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...
- Codeforces Round #131 (Div. 2) : B
首先能被2,5整除的数结尾必须是0: 如果没有0肯定不行: 然后判断他们的和ans%3: 如果==0,直接从大到小输出就行: 如果==1,要么删除它们之间最小的那个%3==1的,要么删除两个小的并且% ...
- Codeforces Round #131 (Div. 1) A - Game
A. Game time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- Codeforces Round #338 (Div. 2) C. Running Track dp
C. Running Track 题目连接: http://www.codeforces.com/contest/615/problem/C Description A boy named Ayrat ...
随机推荐
- 查看软、硬raid信息的方法
软件raid:只能通过Linux系统本身来查看cat /proc/mdstat可以看到raid级别,状态等信息. 硬件raid:最佳的办法是通过已安装的raid厂商的管理工具来查看,有cmdline, ...
- ASP.NET相关技术整理
- WWDC————苹果全球开发者大会
WWDC:Apple Worldwide Developers Conference(苹果全球开发者)的简称,每年定期由苹果公司(Apple Inc.)在美国举办.大会主要的目的是让苹果公司向研发者们 ...
- C# 中解决页面刷新后字体等变大问题
来源:http://blog.csdn.net/wcsjsdn/article/details/5109605 我们在.net开发中时常会遇到一个问题,那就是,当点击某个按钮后,调用js语句,当点击& ...
- Winform登录、控制软件只运行一次、回车登录
Winform登录对很多程序猿来说都有些困惑,登录进入主窗体后要销毁登录窗体,而不是隐藏哦,怎么实现呢? 先贴一段Program.cs的代码 static void Main() { Mutex mu ...
- php final static const成员属性用法
http://www.111cn.net/phper/php/38976.htm 首先来说说final 1.final不能用来修饰成员属性 2.final只能修饰类和方法 作用:被修饰的类不能被子类所 ...
- 【自己动手】sublime text插件开发
今天是五四青年节,在此先祝大家节日快乐!!! --------------------------------------------华丽的分界线--------------------------- ...
- java实现的MySQL自动备份和还原(struts2+Hibernate)---兼容 window+Linux
相信很多朋友都经历过数据库出问题的情况,我也同样(见我的上一篇博文:phpmyadmin误删表后的恢复过程(心惊胆跳啊) ).如果数据很大或者很重要,那么恢复起来是相当困难的,所以我们在做一个相对 ...
- CentOS6.4安装VNC
http://jingyan.baidu.com/article/ca2d939dd1dabbeb6c31ce24.html 一.安装 VNC 默认情况下,CentOS 6.4 是没有安装的. 检查是 ...
- 正整数转换成N进制的数组
给定一个正整数,按照N进制转换成数组元素存储 //给定一个整数,把它转换成按照N进制存储的数组 #include <stdio.h> #include <stdlib.h> # ...