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. 如何把Python2的代码转换为Python3的代码

    如何把Python2的代码转换为Python3的代码 注: 如果对于python2和python3不熟悉的,可以参考: [整理]总结Python2(Python 2.x版本)和Python3(Pyth ...

  2. C#操作XML的完整例子——XmlDocument篇(转载,仅做学习之用)

    原文地址:http://www.cnblogs.com/serenatao/archive/2012/09/05/2672621.html 这是一个用c#控制台程序下,  用XmlDocument 进 ...

  3. UVA11988 Broken KeyBoard

    链表的思想很简单,要做到活用也不难.一般我是这样做得,从实际问题出发,先高度的概括符不符合链表的特点.能不能用链表简单解决.接着,就是编码.链表编码要理清细节性思路,最好是简单的画下图,正如改题的链表 ...

  4. flex——将Sprite控件添加到FLEX UI中

    在Flex的帮助文档里,有很多例子都是扩展Sprite类的.如果想把这些实例添加到你的s:Application中,如:addChild(DisplayObject ),肯定会出错.错误的大致意思是: ...

  5. hdu1588之经典矩阵乘法

    Gauss Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. C++ 顶层 const

    我的主力博客:半亩方塘 本文的主要參考来源来自于:C++ Primer 中文版(第 5 版) 第 57 面至第 58 面 1. 顶层 const 与底层 const 概念 我们知道,指针本身是一个对象 ...

  7. Time.deltaTime和Time.realtimeSinceStartup

    private float f = 0f;void Update () {      f += Time.deltaTime;      Debug.LogError ("Time.delt ...

  8. Android得到一个闹钟在第三方

    收集报警信息 闹铃时间,闹铃备注信息 闹铃引起系统变化的点: 1. Send Notification (正点闹钟能够设置不发送) 2. Play audio 闹铃信息结构体 ClockInfo{ S ...

  9. UVA 10954 Add All

    题意: 给出n个数,要将n个数相加,每次相加所得的值为当次的计算量,完成所有的求和运算后,要求总的计算量最小. 分析: 直接一个优先队列,由小到大排序,每次前两个相加就好. 代码: #include ...

  10. git 删除本地分支和远程分支、本地代码回滚和远程代码库回滚

    [git 删除本地分支] git branch -D br [git 删除远程分支] git push origin :br  (origin 后面有空格) git代码库回滚: 指的是将代码库某分支退 ...