设为首页 加入收藏

TOP

hdu4826---Labyrinth(简单dp)
2015-07-20 17:15:06 来源: 作者: 【 】 浏览:2
Tags:hdu4826---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

Source
2014年百度之星程序设计大赛 - 资格赛

Recommend
liuyiding | We have carefully selected several similar problems for you: 5177 5173 5169 5168 5165

设dp[i][j][0-2]表示从三个方向进入(i, j)的最优值

/*************************************************************************
    > File Name: hdu4826.cpp
    > Author: ALex
    > Mail: zchao1995@gmail.com 
    > Created Time: 2015年02月26日 星期四 17时21分46秒
 ************************************************************************/

#include  #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               using namespace std; const double pi = acos(-1); const int inf = 0x3f3f3f3f; const double eps = 1e-15; typedef long long LL; typedef pair 
              
                PLL; int dp[110][110][3]; int mat[110][110]; int main () { int t; int icase = 1; scanf("%d", &t); while (t--) { int n, m; scanf("%d%d", &n, &m); memset (dp, -inf, sizeof(dp)); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { scanf("%d", &mat[i][j]); } } dp[1][1][0] = dp[1][1][1] = dp[1][1][2] = mat[1][1]; for (int i = 2; i <= n; ++i) { dp[i][1][0] = dp[i - 1][1][0] + mat[i][1]; } for (int j = 2; j <= m; ++j) { for (int i = 1; i <= n; ++i) //从左边进入 { dp[i][j][2] = max (dp[i][j - 1][0], max (dp[i][j - 1][1], dp[i][j - 1][2])) + mat[i][j]; } for (int i = 2; i <= n; ++i) { dp[i][j][0] = max (dp[i - 1][j][0], dp[i - 1][j][2]) + mat[i][j]; } for (int i = n - 1; i >= 1; --i) { dp[i][j][1] = max (dp[i + 1][j][2], dp[i + 1][j][1]) + mat[i][j]; } } int ans = max (dp[1][m][0], max (dp[1][m][1], dp[1][m][2])); printf("Case #%d:\n", icase++); printf ("%d\n", ans); } }
              
             
            
           
          
         
        
       
      
     
    
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇 概率 UVa11346 下一篇BZOJ 2500 幸福的道路 树形DP+单..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)
·使用华为开发者空间 (2025-12-27 04:19:24)
·Getting Started wit (2025-12-27 03:49:24)
·Ubuntu 上最好用的中 (2025-12-27 03:49:20)