Labyrinth

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1804    Accepted Submission(s): 626

Problem Description

度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫。该迷宫仅仅能从矩阵左上角第一个方格開始走。仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能走一格。且仅仅能向上向下向右走曾经没有走过的格子,每个格子中都有一些金币(或正或负。有可能遇到强盗拦路抢劫,度度熊身上金币能够为负。须要给强盗写欠条)。度度熊刚開始时身上金币数为0,问度度熊走出迷宫时候身上最多有多少金币?

 

Input

输入的第一行是一个整数T(T < 200)。表示共同拥有T组数据。

每组数据的第一行输入两个正整数m。n(m<=100。n<=100)。接下来的m行,每行n个整数。分别代表对应格子中能得到金币的数量,每一个整数都大于等于-100且小于等于100。

 

Output

对于每组数据,首先须要输出单独一行”Case #?:”。当中问号处应填入当前的数据组数。组数从1開始计算。

每组測试数据输出一行,输出一个整数。代表依据最优的打法,你走到右上角时能够获得的最大金币数目。

 

Sample Input

2

3 4

1 -1 1 0

2 -2 4 2

3 5 1 -90

2 2

1 1

1 1

 

Sample Output

Case #1:

18

Case #2:

4

题解:

拿到本题。第一想法是DFS,n=100,肯定超时。

后来抓到了关键条件不能往左走,于是非常自然的有了动态规划想法。总的想法是一列一列的处理,当前列依据上一列求得,每一个位置依次上下比較全部可能,总的时间复杂度O(m*n*n)。

自上而下的dp[i][j]=max(dp[i][j],dp[k][j-1]+∑wei[k][j])。k<i。

自下而上的dp[i][j]=max(dp[i][j],dp[k][j-1]+∑wei[k][j]),i<k<n;

贴段代码:

#include <iostream>
#include <cstdio>
using namespace std; const int MAXN = 100+10;
const int INF =100*100*150; int n, m;
int g[MAXN][MAXN];
int dp[MAXN][MAXN]; void Sovle(int x)
{
int i,j,tmp;
for(i = 1; i <= m; ++i)
{
tmp =dp[i][x-1] + g[i][x];
if(dp[i][x] < tmp)
dp[i][x] = tmp;
for(j = i+1; j <= m; ++j)
{
tmp +=g[j][x];
if(tmp > dp[j][x])
dp[j][x] = tmp;
}
}
for(i = m; i > 0; --i)
{
tmp =dp[i][x-1] +g[i][x];
if(dp[i][x] < tmp)dp[i][x] = tmp;
for(j = i-1; j > 0; --j)
{
tmp += g[j][x];
if(tmp >dp[j][x])
dp[j][x] = tmp;
}
}
} int main()
{
int i,j,cas,tag=1;
scanf("%d", &cas);
while(cas--)
{
scanf("%d%d", &m, &n);
for(i = 1; i <= m; ++i)
{
for(j = 1; j <= n; ++j)
{
scanf("%d", &g[i][j]);
dp[i][j] = -INF;
}
}
dp[1][1] = g[1][1];
for(i = 2; i <= m; ++i)
{
dp[i][1] = dp[i-1][1] + g[i][1];
}
for(i = 2; i <= n; ++i)
{
Sovle(i);
}
printf("Case #%d:\n%d\n",tag++, dp[1][n]);
}
return 0;
}

2014百度之星第四题Labyrinth(DP)的更多相关文章

  1. 2014百度之星第三题Xor Sum(字典树+异或运算)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  2. 2014 百度之星 题解 1004 Labyrinth

    Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...

  3. 2014百度之星预赛(第二场)——Best Financing

    2014百度之星预赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理財产品达到收益最大化.已知小A在未来一段时间中的收入情况,描写叙述为两个 ...

  4. 2014百度之星资格赛——Disk Schedule

    2014百度拥有明星格比赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取. 为了提高效率.须要人为安排磁盘读取. 然而.在 ...

  5. 2014百度之星初赛第二场hdu 4831 Scenic Popularity

    Scenic Popularity Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. 2014年百度之星资格赛第四题Labyrinth

    Problem Description 度度熊是一仅仅喜欢探险的熊.一次偶然落进了一个m*n矩阵的迷宫.该迷宫仅仅能从矩阵左上角第一个方格開始走.仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...

  7. 2014百度之星资格赛 1004:Labyrinth(DP)

    Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  8. 2014百度之星资格赛 1001:Energy Conversion(水题,逻辑题)

    Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  9. 2014百度之星第一题Energy Conversion

    Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

随机推荐

  1. HBase 1、HBase介绍和工作原理

    HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google文件 ...

  2. error LNK1104: 无法打开文件“libboost_thread-vc140-mt-gd-1_61.lib”

    error LNK1104: 无法打开文件“libboost_thread-vc140-mt-gd-1_61.lib” 调试->你的项目属性 配置属性->VC++目录 包含目录 D:\bo ...

  3. Iphone JS时间

    var end_time = new Date(time).getTime();//月份是实际月份-1  var start_time= new Date(serverTime).getTime(); ...

  4. Redis 实践笔记

    本文来自:http://www.cnblogs.com/me-sa/archive/2012/03/13/redis-in-action.html 最近在项目中实践了一下Redis,过程中遇到并解决了 ...

  5. docker学习笔记(1)

    (1)Docker介绍 关于Docker的介绍,我就不列举出来了.到百度.谷歌搜索.非常多介绍文章.以下我给出官网的介绍:https://www.docker.com/whatisdocker/ (2 ...

  6. 源码推荐(7.17):不规则按钮类似于遥控器按钮,一个可以最大程度简化PageView与TabView切换的第三方框架

    不规则按钮,类似于遥控器按钮,可以单独控制按钮的上下左右(作者:masa_chu) 不规则按钮,类似于遥控器按钮,可以单独控制按钮的上下左右 测试环境:Xcode 6.2,iOS 6.0以上 Lazy ...

  7. Swift的初始化方法

    我们在深入初始化方法之前,不妨先再想想Swift中的初始化想要达到一种怎样的目的. 其实就是安全.在Objective-C中,init方法是非常不安全的:没有人能保证init只被调用一次,也没有人保证 ...

  8. Windowsclient开发简单介绍(四)

            在上一篇文章里,我简单扼要的给大家介绍了一下GDI的基础知识,包含DC,HDC.GDI对象等等,总的来说都是些偏理论的知识,属于概念的范畴. 今天这篇文章里,我就要正式開始有点实际的东 ...

  9. js类的几种写法

    我们常用的有以下几种方法来用JavaScript写一个“类”: 1. 构造函数(public属性和方法) 1: function Person(iName, iAge){ 2: this.name=i ...

  10. Silverlight学习笔记之页面跳转

    在进行项目开发的时候,经常遇到页面之间的跳转,包括silverlight之间以及silverlight和html之间的跳转. silverlight之间的页面跳转包含两点: 1.主窗体和子窗体 用户新 ...