先上题目:

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. 如何运行开源的React Native项目?

    如何运行开源的RN项目? 1.下载 2.解压 3.配置本地sdk位置 sdk.dir = D\:\\Android\\SDK 4.调整gradle版本 apply plugin: "com. ...

  2. UESTC--1252--24点游戏(dfs)

     24点游戏 Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu Submit Status ...

  3. 杂项-Java:JNI

    ylbtech-杂项-Java:JNI JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++).从Java1.1开始, ...

  4. 截取字符(substr)检索字符位置(instr)

    1.SUBSTR(string,start_position,[length]) 求子字符串,返回字符串注释: string 元字符串start_position 开始位置(从0开始)length 可 ...

  5. 想要学好C/C++,我到底要看多少书才能成为一个合格的C/C++工程师?

    如何学好C语言 这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子.比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便 ...

  6. python 5:str(某一变量)(将其他数字解释为字符串)

    age = messege = "Your's age is " + str(age) #将其他数字更改为字符串 print(messege) 运行结果应该是: Your's ag ...

  7. POJ 1082---->一个神一般的题

    代码只有10行,反正我是看了题解才知道的. 嗯 首先 看到这个题, BFS+一堆判断(什么平年闰年跨年各种乱搞肯定能搞出来,但是Code length就不一定了)... 然后呢 就看到了这个题解 从后 ...

  8. D - Vanya and Fence

    Problem description Vanya and his friends are walking along the fence of height h and they do not wa ...

  9. android黑科技系列——修改锁屏密码和恶意锁机样本原理分析

    一.Android中加密算法 上一篇文章已经介绍了Android中系统锁屏密码算法原理,这里在来总结说一下: 第一种:输入密码算法 将输入的明文密码+设备的salt值,然后操作MD5和SHA1之后在转 ...

  10. Android Studio项目中有用文件与可忽略文件(初学者)

    可通过Settings --> Version Control --> Ignored Files进行设置或察看: 支持指定文件或文件夹,也支持匹配模式. Android Studio 中 ...