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

本题使用动态规划法,这次百度之星有两题都是使用动态规划法的。

时间效率O(N^2),只是好像有人用O(N^3)的时间效率也能过。

这个复杂版本号的找路径问题,一般找路径问题仅仅能往两个方向走,而这个能够往三个方向走的。

关键点:

逐行搜索,可是每行须要从上往下搜一次,然后从下往上搜一次。由于能够往三个方向走, 所以该格可能是从上面走下来,也可能从以下走上来,也能够从左面直接走过来。

由于每行的第一列仅仅能从左跨过来,或者从下上来,最后一列也仅仅能从上下来或者从左跨过来; 那么第一列和最后一列都能够作为该行的初始搜索点。

#include <stdio.h>
#include <vector>
using std::vector;
using std::max; class Labyrinth_2
{
int golds(vector<vector<int> > &b)
{
vector<vector<int> > tbl(b.size(), vector<int>(b[0].size())); tbl[0][0] = b[0][0];
for (int i = 1; i < (int)b.size(); i++)
{
tbl[i][0] = tbl[i-1][0] + b[i][0];
} vector<int> cTbl(b.size());//不是b[0].size()
for (int c = 1; c < (int)b[0].size(); c++)
{
tbl[0][c] = tbl[0][c-1] + b[0][c];
int r = 1;
for ( ; r < (int)b.size(); r++)
{
tbl[r][c] = max(tbl[r-1][c], tbl[r][c-1]) + b[r][c];
}
--r;
cTbl[r] = tbl[r][c-1] + b[r][c];
for (--r; r >= 0; r--)
{
cTbl[r] = max(cTbl[r+1], tbl[r][c-1]) + b[r][c];
tbl[r][c] = max(tbl[r][c], cTbl[r]);
}
}
return tbl[0].back();
}
public:
Labyrinth_2()
{
int T, C, R;
scanf("%d", &T);
for (int t = 1; t <= T; t++)
{
printf("Case #%d:\n", t); scanf("%d %d", &R, &C);
vector<vector<int > > grid(R, vector<int>(C));
for (int i = 0; i < R; i++)
{
for (int k = 0; k < C; k++)
{
scanf("%d", &grid[i][k]);
}
}
printf("%d\n", golds(grid));
}
}
};

2014 百度之星 题解 1004 Labyrinth的更多相关文章

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

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

  2. 2014 百度之星题解 1002 - Disk Schedule

    Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景. 磁盘 ...

  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(DP)

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

  7. 2014 百度之星 1003 题解 Xor Sum

    Xor Sum Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheu ...

  8. 百度之星复赛 1004 / hdu5715 二分dp+trie

    XOR 游戏 Problem Description   众所周知,度度熊喜欢XOR运算[(XOR百科)](http://baike.baidu.com/view/674171.htm). 今天,它发 ...

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

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

随机推荐

  1. LightOJ - 1010 Knights in Chessboard(规律)

    题目链接:https://vjudge.net/contest/28079#problem/B 题目大意:给你一个nxm的棋盘,问你最多可以放几个骑士让他们互相攻击不到.骑士攻击方式如下图: 解题思路 ...

  2. Valid Sudoku&&Sudoku Solver

    Valid Sudoku Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku bo ...

  3. 洛谷P1634 禽兽的传染病 题解

    题目传送门 最近都在刷红色的水题... 这道题因为是不断地传染,所以直接求幂次方就好啦... 但是一测样例WA了... 原来x初始需要加1... 提交评测WA了... 原来要开long long .. ...

  4. [你必须知道的.NET]第二十二回:字符串驻留(上)---带着问题思考

    发布日期:2008.8.27 作者:Anytao © 2008 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. 说在,开篇之前 走钢丝的人,在刺激中体验快感.带着问题思考,在问题 ...

  5. IEEEXtreme 10.0 - Food Truck

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme10.0 - Food Truck 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank.c ...

  6. Java学习(final、static关键词)

    final关键词 概念:final的意思为最终,不可变.final是个修饰符,它可以用来修饰类,类的成员,以及局部变量.不能修饰构造方法. 特点: 1.final修饰的类不可以被继承,但可以继承别的类 ...

  7. thinkphp5.0动态配置

    设置配置参数 使用set方法动态设置参数,例如: Config::set('配置参数','配置值'); // 或者使用助手函数 config('配置参数','配置值'); 也可以批量设置,例如: Co ...

  8. 微信公共服务平台开发(.Net的实现)1 认证“成为开发者”

    http://www.cnblogs.com/freeliver54/p/3725979.html http://www.it165.net/pro/html/201402/9459.html 这些代 ...

  9. viewpager切换耗时控制

    原文地址https://my.oschina.net/javalover/blog/179003 public class FixedSpeedScroller extends Scroller { ...

  10. Python之路【第七篇】:常用模块

    一. 模块介绍 1. 什么是模块 在前面的几个章节中我们基本上是用 python 解释器来编程,如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了. 为此 Python ...