2014 百度之星 题解 1004 Labyrinth

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

时间: 2024-11-11 12:32:03

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

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

Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1507    Accepted Submission(s): 520 Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,

2014 百度之星题解 1002 - Disk Schedule

Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景. 磁盘有许多轨道,每个轨道有许多扇区,用于存储数据.当我们想在特定扇区来读取数据时,磁头需要跳转到特定的轨道.具体扇区进行读取操作.为了简单,我们假设磁头可以在某个轨道顺时针或逆时针匀速旋转,旋转一周的时间是360个单位时间.磁头也可以随意移动到某个轨道进行读取,每跳转到一个相邻轨道的时间为400个单位时间,跳

2014百度之星资格赛题解

比赛链接:点击打开链接 ,,杭电把比赛关了代码都找不到了.. 无责任民科还是mark一下好了.. HDU 4823 Energy Conversion 把式子变换一下发现是一个等比数列,高速幂就可以. #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> using namespace std; #define ll __int64 #define inf 10000

2014百度之星第四题Labyrinth

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矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格

2014百度之星资格赛——Labyrinth

2014百度之星资格赛--Labyrinth Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向上向下向右走以前没有走过的格子,每一个格子中都有一些金币(或正或负,有可能遇到强盗拦路抢劫,度度熊身上金币可以为负,需要给强盗写欠条),度度熊刚开始时身上金币数为0,问度度熊走出迷宫时候身上最多有多少金币? Input 输入的第一行是一个整数T(

2014 百度之星 1003 题解 Xor Sum

Xor Sum Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包含一个正整数 S ,之后 Zeus 需要在集合当中找出一个正整数 K ,使得 K 与 S 的异或结果最大.Prometheus 为了让 Zeus 看到人类的伟大,随即同意 Zeus 可以向人类求助.你能证明人类的智慧么? Input 输入包含若干组测试数

HDU4828 Grids 2014百度之星初赛题解

看看Catalan数的公式:为 Catalan(n) = C(2n, n) / n+1 = C(2n, n) - C(2n, n-1); (公式0) 然后利用全排序表达:Catalan(n) = (2n)! / (n+1) * (n)!*n!; 那么Catalan(n-1) = (2(n-1))! / n * (n-1)!(n-1)!; 然后两者相除就得到:Catalan(n) = (4*n-2) / (n+1) (公式1)//这个就是递归的终极公式了. 一般使用动态规划的递推公式是:Catal

2014 百度之星初赛题解1001 - Energy Conversion

Problem Description 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力. 过了许久,百小度终于读懂魔法文字的含义:石门里面有一个石盘,魔法师需要通过魔法将这个石盘旋转X度,以使上面的刻纹与天相对应,才能打开石门. 但是,旋转石盘需要N点能量值,而为了解读密文,百小度的能量值只剩M点了!破坏石门是不可能的,因为那将需要更多的能量.不过,幸运的是,作为魔法师的百小度可以耗费V点能量,使

2014百度之星程序设计竞赛

资格赛 Energy Conversion 水题. #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> #include <cmath> #define ll long long using namespace std; int main() { int T; scanf("%d&qu