hdu 4826
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的更多相关文章
- hdu 4826 Labyrinth DP
题目链接:HDU - 4826 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向 ...
- hdu 4826(dp + 记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4826 思路:dp[x][y][d]表示从方向到达点(x,y)所能得到的最大值,然后就是记忆化了. #i ...
- 百度之星资格赛 hdu 4826 Labyrinth 动态规划
/********************* Problem Description 是一仅仅喜欢探险的熊.一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上 ...
- HDU 4826 (分类DP)
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 4826 三维dp
dp的问题除了递推过程的设计之外 还有数据结构的选择以及怎样合理的填充数据 这个的填充是个坑..#include<iostream> #include<cstdio> #inc ...
- hdu 4826 Labyrinth(简单dp)
Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向上向下向 ...
- ACM-百度之星资格赛之Labyrinth——hdu4826
Labyrinth Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
随机推荐
- 使用 AFNetworking的时候,怎样管理 session ID
问: As the title implies, I am using AFNetworking in an iOS project in which the application talks to ...
- Android 删除新版安卓fragment_main.xml
在新版本号的ADT中,创建androidproject时默认会产生两个xml文件--fragment_main和activity_main. 个人建议把fragment_main这个文件删除掉 1)将 ...
- 设计一部iphone手机用面向对象的方法
main.m //编辑字体大小command + < //编译执行快捷键 com + R #import <Foundation/Foundation.h> #import &quo ...
- [Linux]history 显示命令执行的时间
显示历史命令之行时间 这里的环境是centos5.8 vim ~/.bashrc 或者 ~/.bash_profile 增加 export HISTTIMEFORMAT="%F %T & ...
- 第19章 Redis的一些常用技术
19.1 Redis的基础事务 图19-1 Redis命令执行事务的过程 19-1:在Spring中使用Redis ...
- thinkphp 内存查询表 防止多次查库
//从内存查询 表 以防止多次查库 private static function selectTable($tableName,array $where,$getFirst=false){ $res ...
- [CF1139 E] Maximize Mex 解题报告 (二分图匹配)
interlinkage: https://codeforces.com/contest/1139/problem/E description: 有$n$个学生,$m$个社团,每个学生有一个能力值,属 ...
- 利用道格拉斯·普客法(DP法)压缩矢量多边形(C++)
1.算法描述 经典的Douglas-Peucker算法(简称DP法)描述如下: (1)在曲线首尾两点A,B之间连接一条直线AB,该直线为曲线的弦: (2)得到曲线上离该直线段距离最大的点C,计算其与A ...
- WPF Menu控件自定义Style
自定义WPF中Menu控件的样式
- vscode中eslint airbnb的简单配置
vscode可以直接在扩展中下载安装eslint,然后,还不能用,需要继续如下步骤: 1.npm install -g eslint 安装完后输入"eslint",有东西出来说明安 ...