Problem 1002: 蛤玮的财宝

Time Limits:  1000 MS   Memory Limits:  65536 KB

64-bit interger IO format:  %lld   Java class name:  Main

Description

蛤玮和他的妹子出海游玩,不小心遭遇了海难,他们醒来之后发现自己到了一座金银岛.岛主非常好心的告诉他们在岛的另一边有船可以送他们回家.

这座岛可以看成n*m的矩阵,蛤玮他们在位置(1,1),而船在位置(n,m).蛤玮发现金银岛遍地都是金子,每个格子里有价值a[i,j]的金子,他和妹子打算在回去的路上带一些走.如果他们路过了位置(i,j),就可以假装系鞋带捡走地上的金子.为了不引起怀疑,他们在走的时候只能往接近码头的方向走,即如果蛤玮现在在(i,j),他只能移动到(i+1,j)或者(i,j+1).为了能拿走更多的金子,蛤玮和妹子决定装作互相不认识,这样他们就可以分开走,从而拿到更多的金子.

蛤玮和他妹子想知道他们最多能拿走多少金子.

注意如果蛤玮和他妹子经过了相同的地方,只能得到一次金子,因为地上的捡完就没有了.

Input

T(1<=T<=10),表示数据组数.

每组数据第一行n,m(1<=n,m<=100),接下来n行,每行m个数,第i行第j列的值a[i,j](1<=a[i,j]<=1000)表示位置(i,j)的金子的价值.

Output

每组数据输出一行,蛤玮和他妹子能拿到的金子总价的最大值.

Sample Input

1
2 2
2 1
1 2

Output for Sample Input

6

一个人的情况下还是比较好写的,两个人就完全懵比了。看了别人的讲解才知道怎么写,两个人就用dp[i][j][ii][jj]来表示两个人共同状态,然后转移方程就是

dp[i][j][ii][jj]=max(dp[i-1][j][ii-1][jj],dp[i-1][j][ii][jj-1],dp[i][j-1][ii-1][jj],dp[i][j-1][ii][jj-1])+value[i][j]+(i==ii&&j==jj)?0:value[ii][jj];

但是这道题显然n、m四维来表示会爆内存,然后就有一种优化像二维DP优化到一维一样,把四维优化到三维。

就有

dp[k][ii][jj]=max(dp[k-1] [ii-1][jj],dp[k-1] [ii][jj-1],dp[k-1] [ii-1][jj-1],dp[k-1] [ii][jj])+value[k-i+1][i]+

(ii==jj)?0:value[ii][jj];
然后就不会RE了。中间循环的时候i与j变量范围注意下,不然下标可能就变成了负的了,RE两次……
代码:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define MM(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long LL;
int pos[202][102];
int dp[202][102][102];
int main(void)
{
int n,m,i,j,tcase,k;
scanf("%d",&tcase);
while (tcase--)
{
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
{
scanf("%d",&pos[i][j]);
}
}
for (k=1; k<=n+m; k++)
{
for (i=1; i<=k; i++)
{
for (j=1; j<=k; j++)
{
int temp=max(max(dp[k-1][i-1][j-1],dp[k-1][i-1][j]),max(dp[k-1][i][j-1],dp[k-1][i][j]));
if(i==j)
dp[k][i][j]=temp+pos[k-i+1][i];
else
dp[k][i][j]=temp+pos[k-i+1][i]+pos[k-j+1][j];
}
}
}
printf("%d\n",dp[n+m][n][m]);
memset(dp,0,sizeof(dp));
}
return 0;
}

最新文章

  1. android 性能优化-电量篇
  2. 将UINavgationController的push改成从左到右
  3. Three.js基本 Demo
  4. win10删除或更改需要SYSTEM或Administrators权限的文件夹
  5. hibernate映射文件基础
  6. [置顶] sql 向另一个表导数据
  7. discuz 添加板块失败解决办法
  8. SSH的jar包下载地址
  9. mysql 提高一 动态sql 传变量
  10. JAVAEE第三周
  11. Virtualization
  12. js获取当前星期几
  13. echarts Cannot read property &#39;getAttribute&#39; of null 问题的解决方法
  14. VScode 光标乱跳
  15. Linux shell while
  16. 【LeetCode】18. 4Sum (2 solutions)
  17. 解决sublime package control 出现There are no packages available for installation
  18. loadrunner 三种post函数区别
  19. Elasticsearch学习系列之term和match查询实例
  20. 配置vim插件遇到youcompleteme插件问题解决方案

热门文章

  1. css布局两边固定中间自适应的四种方法
  2. InitialContext与lookup
  3. Android学习总结(六)———— 发送自定义广播
  4. 联想e431笔记本更改硬盘模式bios设置的详细教程
  5. Codeforces Round #316 (Div. 2) B Simple Game 贪心
  6. C#中Json进行序列化时去掉值为null的节点
  7. hash 散列表
  8. Sql Server 自动备份
  9. ext笔记
  10. java在线聊天项目0.8版 实现把服务端接收到的信息返回给每一个客户端窗口中显示功能