虽然一开始就觉得从右下角左上角直接dp2次是不行的,后面还是这么写了WA了

两次最大的并不一定是最大的,这个虽然一眼就能看出,第一次可能会影响第二次让第二次太小。

这是原因。

5

4 32 1 18 41

47 38 7 43 43

48 23 39 40 23

26 39 33 5 36

31 29 7 26 47

这组数据是结果。

走完第一遍成

0 32 1 18 41

0 38 7 43 43

0 0 0 0 0

26 39 33 5 0

31 29 7 26 0

这样倒着走回去一定会经过0导致第二遍小很多。

正确走法

5

0 32 1 18 41

0 38 7 43 43

0 23 39 40 23

0 0 0 5 36

31 29 0 0 0

然后

5

0 0 1 18 41

0 0 7 43 43

0 0 0 0 0

0 0 0 5 0

31 29 0 0 0

这样和为508比两次取最大的482还大。

完全想不到怎么弄了。上一次求两次和最短路的走过了后就不能走,也想成两次跑最小,也是跪,结果应该用最小费用流。



这个也是没发现,不管怎么走一定每次确定步数后都会在同一条对角线上。

所以可以一条对角线一条一条的推。然而要同时确定两条路,走过去再走回来就等于走过去两条路,经过同一个点的时候只取一次。

dp[d][i][j]表示到第d条对角线时第一条路在i行,第二条路在j行最大的和能取多大,一路推到最后,这里可以用滚动数组dp内存就只有n*n了。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 305;
const ll mod = 1e9 + 7;
const double eps = 1e-12;
int a[N][N];
int dp[2][N][N];
int main() {
int n;cin >> n;
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
cin >> a[i][j];
memset(dp, -2, sizeof dp);
dp[1][1][1] = a[1][1];
int now = 1;
for (int d = 2;d < n + n;d++) {
now ^= 1;
for (int i = max(1,d-n+1);i <= min(n,d);i++)
for (int j = max(1,d-n+1);j <= min(n,d);j++) {
for (int x = i - 1;x <= i;x++) {
for (int y = j - 1;y <= j;y++) {
if (x >= max(1, d - n) && x <= min(n, d - 1) && y >= max(1,d - n) && y <= min(n, d - 1)) {
int val = a[i][d - i + 1] + a[j][d - j + 1];
if (i == j)val /= 2;
dp[now][i][j] = max(dp[now][i][j], dp[now ^ 1][x][y] + val);
}
}
}
}
for (int i = 0;i <= n;i++)
for (int j = 0;j <= n;j++)dp[now ^ 1][i][j] = -1000000000;
}
cout << dp[now][n][n];
return 0;
}

codeforces.com/problemset/problem/213/C的更多相关文章

  1. http://codeforces.com/problemset/problem/594/A

    A. Warrior and Archer time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  2. http://codeforces.com/problemset/problem/712/D

    D. Memory and Scores time limit per test 2 seconds memory limit per test 512 megabytes input standar ...

  3. http://codeforces.com/problemset/problem/847/E

    E. Packmen time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  4. http://codeforces.com/problemset/problem/545/D

    D. Queue time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  5. codeforces 340C Tourist Problem

    link:http://codeforces.com/problemset/problem/340/C 开始一点也没思路,赛后看别人写的代码那么短,可是不知道怎么推出来的啊! 后来明白了. 首先考虑第 ...

  6. codeforces B. Routine Problem 解题报告

    题目链接:http://codeforces.com/problemset/problem/337/B 看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影).接着让我很意外的是,在纸上比划 ...

  7. Codeforces 527D Clique Problem

    http://codeforces.com/problemset/problem/527/D 题意:给出一些点的xi和wi,当|xi−xj|≥wi+wj的时候,两点间存在一条边,找出一个最大的集合,集 ...

  8. Codeforces 706C - Hard problem - [DP]

    题目链接:https://codeforces.com/problemset/problem/706/C 题意: 给出 $n$ 个字符串,对于第 $i$ 个字符串,你可以选择花费 $c_i$ 来将它整 ...

  9. Codeforces 1096D - Easy Problem - [DP]

    题目链接:http://codeforces.com/problemset/problem/1096/D 题意: 给出一个小写字母组成的字符串,如果该字符串的某个子序列为 $hard$,就代表这个字符 ...

随机推荐

  1. Natural Language Toolkit

    http://www.nltk.org/ >>> import nltk >>> nltk.download()

  2. spring mvc配置文件dispatcher-servlet.xml详解

    Spring的配置文档<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="ht ...

  3. C++ builder的文件操作

    在编程的过程中,文件的操作是一个经常用到的问题,在C++Builder中,可以使用多种方法对文件操作,下面我就按以下几个部分对此作详细介绍,就是:1.基于C的文件操作:2.基于C++的文件操作:3.基 ...

  4. 浅析C++的内存管理

    在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/ 静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参 ...

  5. java继承覆盖总结

      Java基础(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. java的继承与覆盖基本是java笔试中常出的题,也比较绕,我这里对java的继承覆盖做一个总结1.构造函数:      ...

  6. nginx php解析过慢

    nginx 报错 upstream timed out (110: Connection timed out)解决方案 error.log报错如下: 2013/05/18 21:21:36 [erro ...

  7. 【转】unity开发android游戏(一)搭建Unity安卓开发环境

    http://blog.csdn.net/chenggong2dm/article/details/20654075 1,下载安装Java的JDK: http://www.oracle.com/tec ...

  8. duplicate symbol _OBJC_CLASS 错误处理方法

    错误: ld: duplicate symbol _OBJC_CLASS_$_************ in **************** 一种可能性是你的项目的不同group里有着相同名称的类 ...

  9. 【android学习1】:安装MySQL启动服务失败解决方法

    最近需要用到MySQL,从官网上下载了一个安装文件,但是安装时一直弹出如下提示信息: Configuration of MySQL Server 5.7 is taking longer than e ...

  10. SQLSERVER 16进制与10进制转换

    最近工控项目中遇到的16进制与10进制转换,在.NET中比较容易实现,在SQLSERVER中发现没有直接的转换,尤其是出现超出范围的long负数,即无符号64位整数在sqlserver中的存储.网上找 ...