题目链接:

http://codeforces.com/problemset/problem/214/E

Relay Race

time limit per test4 seconds
memory 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的更多相关文章

  1. Codeforces Round #131 (Div. 2)

    A. System of Equations \(a\)的范围在\(\sqrt n\)内,所以暴力枚举即可. B. Hometask 需要被2.5整除,所以末位必然为0,如果0没有出现,则直接返回-1 ...

  2. Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)

    题目链接:http://codeforces.com/contest/283/problem/B 思路: dp[now][flag]表示现在在位置now,flag表示是接下来要做的步骤,然后根据题意记 ...

  3. Codeforces Round #346 (Div. 2) D Bicycle Race

    D. Bicycle Race 题目链接http://codeforces.com/contest/659/problem/D Description Maria participates in a ...

  4. Codeforces Round #346 (Div. 2) D. Bicycle Race 叉积

    D. Bicycle Race 题目连接: http://www.codeforces.com/contest/659/problem/D Description Maria participates ...

  5. Codeforces Round #131 (Div. 1) B. Numbers dp

    题目链接: http://codeforces.com/problemset/problem/213/B B. Numbers time limit per test 2 secondsmemory ...

  6. Codeforces Round #131 (Div. 2) B. Hometask dp

    题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...

  7. Codeforces Round #131 (Div. 2) : B

    首先能被2,5整除的数结尾必须是0: 如果没有0肯定不行: 然后判断他们的和ans%3: 如果==0,直接从大到小输出就行: 如果==1,要么删除它们之间最小的那个%3==1的,要么删除两个小的并且% ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. IOS基础——alloc、init和new方法

    alloc:分配内存. init:初始化. new:代替上面两个函数:分配内存,并且初始化. 注意: 1.在实际开发中很少会用到new,一般创建对象时我们一般是 [[className alloc]i ...

  2. SqlServer存储过程

    新上线的车管系统,今天要给User添加权限,才发现这个后台加权限简直how to play .. 比如有人申请合肥的关务权限: 1.SITE 是合肥 2.ORG 有B81,P81,S81,M81等 3 ...

  3. webview 中 svg的坑

    在这里不会详细介绍如何绘制svg图片,是讲一个很小的bug,看图 在这张图中,上面带有纹理和弧度的图片,原本是直接切了一张png的图片,但是由于是在app的登录注册的首页,那么这个35k的图片就会非常 ...

  4. PHP错误处理及异常处理笔记

    给新人总结一下PHP的错误处理. PHP提供了错误处理和日志记录的功能. 这些函数允许你定义自己的错误处理规则,以及修改错误记录的方式. 这样,你就可以根据自己的需要,来更改和加强错误输出信息以满足实 ...

  5. Yii中使用PHPExcel导出Excel

    最近在研究PHP的Yii框架,很喜欢,碰到导出Excel的问题,研究了一下,就有了下面的方法: 1.首先在config/main.php中添加对PHPExcel的引用,我的方式是这样: // auto ...

  6. 发短信的主要代码(SmsManger)

    SmsManager smsManager=SmsManager.getDefault(); smsManager.sendTextMessage(number,null,sms, null,null ...

  7. ASP.NET MVC5学习笔记之Controller执行ControllerDescriptor和ActionDescriptor

    一. ControllerDescriptor说明 ControllerDescriptor是一个抽象类,它定义的接口代码如下: public abstract class ControllerDes ...

  8. 【转】资源文件在Delphi编程中的应用

    段东宁 计亚南 (郴州职业技术学院, 湖南 郴州  423000) 摘要: 资源文件是一种能有效地组织.管理和使用资源的文件形式,在软件开发中有着广泛的应用.本文详细介绍了在Delphi编程中资源文件 ...

  9. 金山词霸每日一句开放平台 .NET demo

    先附上地址:http://open.iciba.com/?c=api 小金山提供了2种获取数据的方式 1. 通过填入自己的网站名称.网址.邮箱地址 来生成一段javascript脚本,直接将生成的代码 ...

  10. 【转载】学习C#的28条建议

    1. 看得懂的书,请仔细看:看不懂的书,请硬着头皮看:2. 别指望看第一遍书就能记住和掌握什么——请看第二遍.第三遍:3. 学习编程的秘诀是:编程,编程,再编程:4. 请把书上的程序例子亲手输入到电脑 ...