hdu 4826

题意

度度熊是一只喜欢探险的熊,一次偶然落进了一个 $ m * n $ 矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向上向下向右走以前没有走过的格子,每一个格子中都有一些金币(或正或负,有可能遇到强盗拦路抢劫,度度熊身上金币可以为负,需要给强盗写欠条),度度熊刚开始时身上金币数为0,问度度熊走出迷宫时候身上最多有多少金币?

解法

我们设 $ dp[i][j][0/1/2] $ 分别表示,从上面走到 $ ( i , j ) $ ,从左边走到 $ ( i , j ) $ ,从下面走到 $ ( i , j ) $ 的最大值。

那么我们有转移方程:

$dp[i][[j][1] = max(dp[i][j-1][0],dp[i][j-1][1],dp[i][j-1][2]) + a[i][j] $

$dp[i][[j][0] = max(dp[i-1][j][0],dp[i-1][j][1]) + a[i][j] $

$dp[i][[j][2] = max(dp[i+1][j][2],dp[i+1][j][1]) + a[i][j] $

之所以 \(dp[i][j][0]\) 不从 \(dp[i-1][j][2]\) 转以来,是因为 \(dp[i-1][j][2]\) 取决于 \(dp[i][j][0/1/2]\) 中的最大值,不满足拓扑序。(或者说你从(i,j)走到(i-1,j)又走了回来,就算重复了)

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
#define INF 0x3f3f3f3f
#define MAX 0x7ffffffffffffff
#define del(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
template<typename T>
inline void read(T&x)
{
x=0;T k=1;char c=getchar();
while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=k;
}
const int maxn=105;
int dp[maxn][maxn][3];
int a[maxn][maxn];
int n,m; int main()
{
int t;
read(t);
for(int k=1;k<=t;k++){
read(n),read(m);
del(a,0);del(dp,-INF);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
read(a[i][j]); dp[1][1][0]=dp[1][1][1]=dp[1][1][2]=a[1][1];
for(int i=2;i<=n;i++) dp[i][1][0]=dp[i-1][1][0]+a[i][1]; for(int j=2;j<=m;j++){ for(int i=1;i<=n;i++)
dp[i][j][1]=max(dp[i][j-1][0],max(dp[i][j-1][1],dp[i][j-1][2]))+a[i][j];
// 下面两个要用到dp[i][j][1] 所以先处理dp[i][j][1]
for(int i=2;i<=n;i++)
dp[i][j][0]=max(dp[i-1][j][1],dp[i-1][j][0])+a[i][j];
for(int i=n-1;i>=1;i--)
dp[i][j][2]=max(dp[i+1][j][1],dp[i+1][j][2])+a[i][j];
}
printf("Case #%d:\n",k);
printf("%d\n",max(dp[1][m][0],max(dp[1][m][1],dp[1][m][2])));
}
return 0;
}

hdu 4826的更多相关文章

  1. hdu 4826 Labyrinth DP

    题目链接:HDU - 4826 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向 ...

  2. hdu 4826(dp + 记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4826 思路:dp[x][y][d]表示从方向到达点(x,y)所能得到的最大值,然后就是记忆化了. #i ...

  3. 百度之星资格赛 hdu 4826 Labyrinth 动态规划

    /********************* Problem Description 是一仅仅喜欢探险的熊.一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上 ...

  4. HDU 4826 (分类DP)

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

  5. hdu 4826 三维dp

    dp的问题除了递推过程的设计之外 还有数据结构的选择以及怎样合理的填充数据 这个的填充是个坑..#include<iostream> #include<cstdio> #inc ...

  6. hdu 4826 Labyrinth(简单dp)

    Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向上向下向 ...

  7. ACM-百度之星资格赛之Labyrinth——hdu4826

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

  8. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

随机推荐

  1. codevs 2460 树的统计

    2460 树的统计   题目描述 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I.             ...

  2. [Cypress] Get started with Cypress

    Adding Cypress to a project is a simple npm install away. We won’t need any global dependencies beyo ...

  3. Android之后台启动Activity

    在实际开发中.Activity须要启动但界面又不能显示出来,这时就须要后台启动.但又不是finish(),这时就要用到Activity中的moveTaskToBack函数,先看下官网 參数nonRoo ...

  4. 6581 Number Triangle

    6581 Number Triangle 时间限制:500MS  内存限制:1000K提交次数:57 通过次数:47 题型: 编程题   语言: G++;GCC Description 7 3 8 8 ...

  5. HDOJ GCD 2588【欧拉函数】

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

  6. hdoj--5093--Battle ships(二分图经典建图)

    Battle ships Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  7. Tomcat安全设置与优化详解(非原创)

    一.Tomcat简介二.Tomcat安全设置三.Tomcat优化四.参考文章   一.Tomcat简介 Tomcat 是 Apache软件基金会下的一个免费.开源的WEB应用服务器,它可以运行在 Li ...

  8. [Luogu1273] 有线电视网

    [Luogu1273] 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树 ...

  9. ViewData与ViewBag的使用区别

    在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下: ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从 ...

  10. JS中数组的一些笔记

    今天工作时碰到一个需求,有两个数组arrayChild, arrayFather, 要求: 1.往数组arrayChild中放入一个元素: 2.将当前的数组arrayChild放入arrayFathe ...