题目链接:

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. linux下proc目录详解

    proc/pid记录了什么cd /proc/之后,你会发现很多的目录和文件,今天首先来介绍的就是那些以数字命名的目录--它们就是linux中的进程号,每当你创建一个进程时,里面就会动态更新多出一个名称 ...

  2. 未能加载文件或程序集“Oracle.Web, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342”或它的某一个依赖项

    当前系统环境描述: Win7x64+VS2012+IIS7 当前情况描述: 发布Web服务,在浏览的时候出现以下问题:未能加载文件或程序集“Oracle.Web, Version=2.112.1.0, ...

  3. 三、MongoDB的创建、更新和删除

    一.MongoDB的下载.安装与部署 二.MongoDB的基础知识简介 三.MongoDB的创建.更新和删除 概要 下面开始学习MongoDB最重要也是最基础的部分:C(创建)R(查询)U(更新)D( ...

  4. 3种方式实现Java多线程

    java中实现多线程的方法有两种:继承Thread类和实现runnable接口. 1.继承Thread类,重写父类run()方法 public class thread1 extends Thread ...

  5. web.xml中的url-pattern映射规则

    Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单.servlet和filter中的url-pattern有一些文章在里面的,总结了一些东西,以免遇到问题又要浪费时间. 一,s ...

  6. 如何将两个列表变成一个python字典

    一个列表是 index = [0, 1, 2, 3, 4, 5, 6] 另一个是 day = ['1', '2', '3', '4', '5', '6', '7' ] 可以使用dict(zip(ind ...

  7. Android Activity生命周期以及Fragment生命周期的区别与分析

    Android Fragment生命周期图: Activity生命周期图: 对照图: Fragment生命周期分析: 1. 当一个fragment被创建的时候,它会经历以下状态. onAttach() ...

  8. rails bug

    variable @fontAwesomeEotPath_iefix is undefined rails generate bootstrap:install如果还有错,保证在加载主提之前impor ...

  9. mamp pro

    MAMP PRO Settings and Files /Library/Application Support/appsolute/MAMP PRO ~/Library/Application Su ...

  10. ruby on rails 实战(二)

    1,修改routes文件,让所有的action都可以使用get或者post方式访问 match "/:controller/:action" => "control ...