Labyrinth

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

Total Submission(s): 668    Accepted Submission(s): 299

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
  1. 2
  2. 3 4
  3. 1 -1 1 0
  4. 2 -2 4 2
  5. 3 5 1 -90
  6. 2 2
  7. 1 1
  8. 1 1
 
Sample Output
  1. Case #1:
  2. 18
  3. Case #2:
  4. 4
  5.  
  6. /*
  7.   dp。第一列最大直接求出,因为只有一种走法(向下)。然后后面有两种、==向下|| 向上。可推到出状态方程为
  8.   						dp[i][j] = max(dp[i-1][j],dp[i][j-1]) + a[i][j] (向下)
  9. 						dp[i][j] = max(dp[i+1][j], dp[i][j-1]) + a[i][j] (向上)
  10. */
  11. #include <iostream>
  12. #include <cstdio>
  13. #include <cstring>
  14. #include <string>
  15. #include <cstdlib>
  16. #include <algorithm>
  17. #include <set>
  18. #include <utility> 
  19. #define INF 0xfffffff
  20. #define max1 110
  21. int a[max1][max1], dp[max1][max1], dp1[max1], dp2[max1];
  22. int max(int a, int b) {
  23. 	return a>b?a:b;
  24. }
  25. int main() {
  26. 	int t, flag = 1;
  27. 	scanf("%d",&t);
  28. 	while (t --) {
  29. 		memset(a, 0, sizeof(a));
  30. 		int m, n;
  31. 		scanf("%d%d",&m, &n);
  32. 		for (int i = 1; i<=m; i++)
  33. 			for (int j = 1; j<=n; j++)		scanf("%d",&a[i][j]);
  34. 		memset(dp, 0, sizeof(dp));
  35. 		for (int i = 2; i<=m; i++) {
  36. 			a[i][1] = a[i][1] + a[i-1][1];
  37. 		}
  38. 		dp1[0] = dp2[0] = dp1[m+1] = dp2[m+1] = -9999999;
  39. 		for (int j = 2; j<=n; j++) {
  40. 			//向下
  41. 			for (int i = 1; i<=m; i++) {
  42. 				dp1[i] = max(dp1[i-1], a[i][j-1]) + a[i][j];
  43. 			}
  44. 			//向上
  45. 			for (int i = m; i>=1; i--) {
  46. 				dp2[i] = max(dp2[i+1], a[i][j-1]) + a[i][j];
  47. 			}
  48. 			for (int i = 1; i<=m; i++) {
  49. 				a[i][j] = max(dp1[i], dp2[i]);
  50. 			}
  51. 		}
  52. 		printf("Case #%d:\n%d\n",flag++, a[1][n]);
  53. 	}
  54. 	return 0;
  55. }

HDU_4826的更多相关文章

随机推荐

  1. vs发布项目webconfig替换语法

    关于vs发布项目时webconfig替换语法也是最近才学到的东西,写这篇文章就当是作个备忘录吧,如果能帮助别人能够学习到webconfig如何替换那就再好不过了. 1.认识一下web项目下的web.D ...

  2. JS画几何图形之四【饼图】

    饼图是将一个圆分割为多个扇形. 样例:http://www.zhaojz.com.cn/demo/draw8.html 依赖:[扇形] //饼图 //dot 圆点 //r 半径 //data 数据(一 ...

  3. appium 解锁九宫格

    很多人在自动化的过程中,对解锁9宫格有很多麻烦,特别是app上的有些整个放在整个view中,这就给我们测试解锁九宫格带来问题了,笔者尝试了去解决,但是都没有找到一个很好的方案,那么我就试着先去通过安卓 ...

  4. python 中一些关键字的区别

    一.raw_input 和input input和raw_input都可以读取控制台的输入,但是input和raw_input在处理数字时是有区别的 1.当输入为纯数字时 input返回的是数值类型, ...

  5. PHP call_user_func

    <?php function my_call_back_function(){ echo "hello world!"; } class MyClass{ static fu ...

  6. 再谈javascript面向对象编程

    前言:虽有陈皓<Javascript 面向对象编程>珠玉在前,但是我还是忍不住再画蛇添足的补上一篇文章,主要是因为javascript这门语言魅力.另外这篇文章是一篇入门文章,我也是才开始 ...

  7. Integer和int

    例1: public static void main(String[] args){ Integer a = 128,b = 128; Integer c = 127,d = 127; System ...

  8. 阿里云ECS搭建SVN配置外网

    阿里云ECS搭建SVN后,配置外网启动不了,检查云服务器没发现问题,后来发现是阿里云拦截,需要在阿里云控制台ECS安全组新增如下配置:

  9. python重试装饰器的简单实现

    简单实现了一个在函数执行出现异常时自动重试的装饰器,支持控制最多重试次数,每次重试间隔,每次重试间隔时间递增. 最新的代码可以访问从github上获取 https://github.com/black ...

  10. Micropython教程之TPYBoardv102 DIY蓝牙智能小车实例

    1.实验目的 1.学习在PC机系统中扩展简单I/O接口的方法. 2.进一步学习编制数据输出程序的设计方法. 3.学习蓝牙模块的接线方法及其工作原理. 4.学习L298N电机驱动板模块的接线方法. 5. ...