先上题目:

Labyrinth

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2911    Accepted Submission(s): 1007

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
 
  中文题意不解释,思路:DP,有点像数塔,就是转移的时候需要做的步骤多了一点。在每一次转移去下一层之前需要确定当前一层的每一格三个值,①从上面一层转移到这一个的最大值,②从当前格左边转移过来的最大值,③从当前格右边转移过来的最大值。
  分析可知,从当前格左边转移到当前格只于当前格左边的格子有关,从当前格右边转移到当前格只于当前格右边的格子有关。从上一层对应格转移到当前格只于上一层对应的那一格有关。需要注意的是在边界上面的格需要特殊处理,顶层的格(既开始的时候所在那一层)只可以向水平的一个方向和向下转移。而两边的格无法从它的边缘转移到最值,所以最左边的格子的从左边转移过来的最值可以等于从上方转移过来的最值,同理最右边的格子的从右边转移过来的最值可以等于从上方转移过来的最值。(这里定义起点所在那一层是顶层,终点所在那一层是底层)。
 
上代码:
 
 #include <cstdio>
#include <cstring>
#define max(x,y) (x >= y ? x : y)
#define MAX 102
#define INF (1<<30)
using namespace std; int c[MAX][MAX];
int dp[MAX][MAX]; /* 0 :left 1:behind 2 : right*/
int ldp[MAX][MAX],rdp[MAX][MAX];
int n,m; void reset(){
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++) for(int j=;j<=m;j++) dp[i][j] = dp[i][j] = dp[i][j] = -INF;
} int main()
{
int t;
//freopen("data.txt","r",stdin);
scanf("%d",&t);
for(int z=;z<=t;z++){
scanf("%d %d",&m,&n);
memset(c,,sizeof(c));
reset();
memcpy(ldp,dp,sizeof(dp));
memcpy(rdp,dp,sizeof(dp));
for(int j=;j<=m;j++) for(int i=;i<=n;i++) scanf("%d",&c[i][j]);
dp[][] = dp[][] = dp[][] = c[][];
for(int j=;j<=m;j++) dp[][j] = dp[][j-]+c[][j];
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
dp[i][j] = dp[i-][j] + c[i][j];
}
ldp[i][] = dp[i][];
for(int j=;j<=m;j++){
ldp[i][j] = max(ldp[i][j] , max(dp[i][j] , ldp[i][j-]+c[i][j]) );
}
rdp[i][m] = dp[i][m];
for(int j=m-;j>=;j--){
rdp[i][j] = max(rdp[i][j] , max(dp[i][j] , rdp[i][j+]+c[i][j]));
} for(int j=;j<=m;j++) dp[i][j] = max(dp[i][j] , max(ldp[i][j] , rdp[i][j]));
}
printf("Case #%d:\n%d\n",z,dp[n][]);
}
return ;
}

1004

百度之星2014资格赛 1004 - Labyrinth的更多相关文章

  1. [百度之星2014资格赛] Disk Schedule 报告

    Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  2. 百度之星2014资格赛 1003 - Xor Sum

    先上代码: Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)T ...

  3. 【百度之星2014~初赛(第二轮)解题报告】Chess

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  4. 【百度之星2014~初赛(第二轮)解题报告】JZP Set

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  5. 【百度之星2014~复赛 解题报告~正解】The Query on the Tree

    声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...

  6. 【百度之星2014~复赛)解题报告】The Query on the Tree

    声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...

  7. 百度之星2014复赛 - 1002 - The Query on the Tree

    先上题目: The Query on the Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  8. 百度之星2014复赛 - 1001 - Find Numbers

    先上题目: Find Numbers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

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

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

随机推荐

  1. C++ Web 编程(菜鸟教程)

    C++ Web 编程(菜鸟教程) C++ Web 编程 什么是 CGI? 公共网关接口(CGI),是一套标准,定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的. CGI 规范目前是由 NC ...

  2. bzoj4197 [Noi2015]寿司晚宴——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4197 首先,两个人选的数都互质可以看作是一个人选了一个数,就相当于选了一个质因数集合,另一个 ...

  3. HTTP服务端JSON服务端

    HTTP服务端JSON服务端 最后更新日期:  2014-5-18 Author: Kagula 阅读前提: CMake工具的基本使用 内容简介: CPPCMS是个开源Web开发框架,通过它可以很容易 ...

  4. BZOJ 1914 计算几何

    思路: 我们可以算不合法的 如果三个点都在同一侧 就不合法.. 用总方案数减掉就可以了 (有神奇的实现方法...) //By SiriusRen #include <cmath> #inc ...

  5. wcf 错误:无法加载或初始化请求的服务提供程序

    解决办法:cmd netsh winsock reset 恢复网络编程接口

  6. 生成jsp验证码的代码详解(servlet版)

    package util; import java.util.*; import java.io.*; import java.awt.*; import java.awt.image.*; impo ...

  7. backface-visibility当元素不面向屏幕时是否可见

    html代码 <h1>div1可见</h1> <div class="div1">div---1</div> <h1>d ...

  8. js-var变量作用域

    看代码: var a=10; function fn1(){ alert(a); var a=20; alert(a); } 运行结果:undefined 和 20 注意: 在函数内,变量如没用var ...

  9. Eclipse之向前快进,向后快退

    在已经写好的代码上进行修改,存在代码快需要向前快进,向后快退的情况. 选中代码块,然后右击,有Shift Right, Shift Left

  10. WebForm 登陆test

    <script> window.onload = function () { document.getElementById("form1").onsubmit = f ...