先上题目:

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. 【BZOJ 1370】 团伙

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1370 [算法] 并查集 + 拆点 [代码] #include<bits/std ...

  2. Ruby类扩张(extension)

    创建: 2017/09/07 更新: 2017/09/16 修改标题字母大小写 ruby ---> Ruby    扩张类  class 类名     扩张的内容  end           ...

  3. 关于每次取PC的值为PC+4的问题

    关于ARM的书上常说由于流水线特性,在指令执行期间读取程序计数器时,读出的值需要为当前指令+4 一开始总是不理解,今天被一位大神一语道破其中精髓.... 程序计数器(PC)总是指向“正在取指”的指令 ...

  4. HBase编程 API入门系列之get(客户端而言)(2)

    心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. 前面是基础,如下 HBase编程 API入门系列之put(客户端而言)(1) package zhouls.bigdata.Hba ...

  5. 5.7 Maven通俗讲解

    好的东西只适合ctry+c+v 原文地址:https://blog.csdn.net/shuzhe66/article/details/45009175 Maven通俗讲解 也许是本人不才,初识Mav ...

  6. SQLServer2008 有用的判断函数

    ISNULL(参数1,参数2) 若参数1为空,则返回参数2 NULLIF(参数1,参数2) 若参数1和参数2不等,则返回参数1 若参数1和参数2相等,则返回NULL 例子:ISNULL(NULLIF( ...

  7. Android点击跳转到淘宝的某一商品详情页或者某一店铺页面

    最近项目的有个需求是点击购买资料按钮进入淘宝界面,简单分析一下,如果用户手机有淘宝就打开淘宝的页面,没有的话也可以选择使用webView进行展示,还是使用手机浏览器进行展示. 判断有无淘宝的代码就不贴 ...

  8. ThreadPoolExecutor理解

    ThreadPoolExecutor组成 ThreadPoolExecutor的核心构造函数: public ThreadPoolExecutor(int corePoolSize, int maxi ...

  9. DeltaFish 校园物资共享平台 第六次小组会议

    DeltaFish 校园物资共享平台 第六次小组会议 记录人:娄雨禛 2018.6.3 任务进度(2018.5.28-2018.6.3) 前端 李鑫:商品详情界面设计.总体配色分析 刘鼎乾:卖家页面初 ...

  10. turn.js中文API 写一个翻页效果的参数详细解释

    $('.flipbook').turn({     width: 922,     height: 600,     elevation: 50,     gradients: true,     a ...