题目为中文,题意略。

这个题目我开始用贪心做bfs两次,这样做是错的,因为两次局部的最优解并不能得出全局的最优解,以下面样例说明:

3

0   10   -1

10   10   10

1   0   10

第一次贪心后:

0   10   -1

0   0   0

1   0   0

第二次贪心后:

0   0   -1

0   0   0

1   0   0

这样贪心取到的值是50,然而我们完全有方案取到51。

为什么会造成这样的状况呢?是因为我们没有枚举出所有状态,而且说明了全局的最优不等于局部最优之和。

我们首先要确认,从左上到右下,再返回左上,和两个人同时从左上出发,最终同时到达右下是等效的。

我们定义dp[i][j][k]----第一个人横坐标是i,第二个人横坐标是j,当前已走k步,所能获取最大值。由于小茗走的是最短路,

所以我们可以利用k求得横坐标相应的纵坐标

详见代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define maxn 105
using namespace std;
typedef long long LL;
const LL INF = 1e14; LL dp[maxn][maxn][];
LL value[maxn][maxn];
int n;
int mov1[] = {,,-,-};
int mov2[] = {,-,,-}; int main(){
while(scanf("%d",&n) == ){
for(int k = ;k < ;++k){
for(int i = ;i <= n;++i){
for(int j = ;j <= n;++j){
dp[i][j][k] = -INF;
}
}
}
for(int i = ;i <= n;++i){
for(int j = ;j <= n;++j){
scanf("%I64d",&value[i][j]);
}
}
dp[][][] = value[][];
for(int k = ;k <= * n - ;++k){
for(int i = ;i <= n;++i){
for(int j = ;j <= n;++j){
dp[i][j][k & ] = -INF;
int x1 = i,x2 = j;
int y1 = + (k - (i - )),y2 = + (k - (j - ));
if(y1 < || y1 > n || y2 < || y2 > n) continue;
//printf("now is (%d,%d) (%d,%d)....\n",x1,y1,x2,y2);
for(int c = ;c < ;++c){
int xx1 = x1 + mov1[c],xx2 = x2 + mov2[c];
int yy1 = + ((k - ) - (xx1 - )),yy2 = + ((k - ) - (xx2 - ));
if(xx1 < || xx2 < || yy1 < || yy2 < ) continue;
if(dp[xx1][xx2][(k - ) & ] == -INF) continue;
LL add = ;
if(x1 == x2 && y1 == y2) add = value[x1][y1];
else add = value[x1][y1] + value[x2][y2];
//printf("from (%d,%d) (%d,%d)\n",xx1,yy1,xx2,yy2);
dp[x1][x2][k & ] = max(dp[x1][x2][k & ],dp[xx1][xx2][(k - ) & ] + add);
}
//printf("maxvalue: %I64d\n",dp[x1][x2][k]);
}
}
}
LL ans = dp[n][n][( * n - ) & ];
printf("%I64d\n",ans);
}
return ;
} /*
3
0 10 -1
10 10 10
1 0 10
*/

ps:感谢fp大佬提供的数据

FZU 2234的更多相关文章

  1. FZU 2234 牧场物语【多线程dp】

     Problem 2234 牧场物语  Problem Description 小茗同学正在玩牧场物语.该游戏的地图可看成一个边长为n的正方形. 小茗同学突然心血来潮要去砍树,然而,斧头在小茗的右下方 ...

  2. DP Training(Updating)

    感觉前面做了那么多$dp$全是自己想的还是太少啊…… 好像在LZT的博客上看到了不错的资源?赶紧开坑,以一句话题解为主 Codeforces 419B 第一题就开始盗图 由于只有一个交点,手玩一下发现 ...

  3. FZU 2137 奇异字符串 后缀树组+RMQ

    题目连接:http://acm.fzu.edu.cn/problem.php?pid=2137 题解: 枚举x位置,向左右延伸计算答案 如何计算答案:对字符串建立SA,那么对于想双延伸的长度L,假如有 ...

  4. FZU 1914 单调队列

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...

  5. ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】

     FZU 2105  Digits Count Time Limit:10000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  6. FZU 2112 并查集、欧拉通路

    原题:http://acm.fzu.edu.cn/problem.php?pid=2112 首先是,票上没有提到的点是不需要去的. 然后我们先考虑这个图有几个连通分量,我们可以用一个并查集来维护,假设 ...

  7. ACM: FZU 2107 Hua Rong Dao - DFS - 暴力

    FZU 2107 Hua Rong Dao Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  8. ACM: FZU 2112 Tickets - 欧拉回路 - 并查集

     FZU 2112 Tickets Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u P ...

  9. ACM: FZU 2102 Solve equation - 手速题

     FZU 2102   Solve equation Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

随机推荐

  1. list类型

    list是一个链表结构,可以模拟栈,队列 lpush list中压入一个元素   模拟栈 lrange  取出list的中的元素(0 -1 表示从头取到尾) rpush list中压入一个元素   模 ...

  2. cmd 指令

    dir  展示当前文件夹内的文件 mkdir 创建文件夹 c:  访问C盘 (d: f:) cd\ 返回主文件 cd .. 返回上一文件夹 cd test  打开文件夹 访问文件夹 rd 删除文件夹 ...

  3. python_冒泡算法

    什么是冒泡算法? -- 像鱼吐泡泡一样,每次都是向上冒出一个水泡 如何逻辑整理? -- 先拿第一个值和剩下的值,一一比较,必能找到最大的或者最小的 -- 比较过程中,第一个值小于剩下的某个值,交换位置 ...

  4. linkin大话面向对象--构造器详解

       对象的产生格式:类名称  对象名 = new  类名称(); 因为有(),所以是方法,实际上它就是构造方法,并且是非私有的构造方法.如:CellPhone cp = new CellPhone( ...

  5. 重拾Python(1):使用Anaconda搭建Python开发环境(Windows7)

    1.为什么选择Anaconda? Anaconda解决了Python使用痛点. Python好用但是令人头疼的就是库管理与Python不同版本的问题,特别是Windows环境下. 2.什么是Anaco ...

  6. mysql修改root用户密码

    自我总结,欢迎拍砖! 目的:若root用户密码忘记,则需要重新设置root用户的密码. 步骤: 1.找到mysql安装目录下的 my.ini 文件,找到[mysqlId]一行,在下方添加语句:skip ...

  7. MySQL数据库中实现对中文字段按照首字字母排序

    转载自网络! 1. 在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在MySQL的很多版本中都存在. 如果这个问题不解决, ...

  8. requestAnimationFrame的用法

    该方法用于在浏览器中制作动画.通过递归调用同一方法来不断更新画面以达到动起来的效果,但它优于setTimeout/setInterval的地方在于它是由浏览器专门为动画提供的API,在运行时浏览器会自 ...

  9. MIB Browser如何导入已编译的mib

    开发过程中,如果需要来回在几套mib之间来回切换,每次都进行编译工作那将是一件很繁琐的事情,我们可以直接导入已经编译好的mib文件,避免重复的编译工作. 第一步,备份已经编译好的mib文件.    将 ...

  10. C++ 关于字符串总结(持续更新)

    1.find_first_of size_type find_first_of( const basic_string &str, size_type index = 0 ); size_ty ...