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 ...
随机推荐
- codevs——T2894 Txx考试
http://codevs.cn/problem/2894/ 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descri ...
- MyBatis在注解上使用动态SQL(@select使用if)
1.用script标签包围,然后像xml语法一样书写 @Select({"<script>", "SELECT * FROM tbl_order", ...
- HDU 5338 ZZX AND PERMUTATIONS 线段树
pid=5338" target="_blank" style="text-decoration:none; color:rgb(45,125,94); bac ...
- Android 源代码解析 之 setContentView
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41894125,本文出自:[张鸿洋的博客] 大家在平时的开发中.对于setCont ...
- 面向对象的三大特性之二——继承(含super的使用)
1.继承的语法:class 子类 extends 父类 例1: class Person { int age; String name; public void print1() { System.o ...
- 初探boost之noncopyable学习笔记
noncopyable 功能 同意程序轻松实现一个不可复制的类. 需包括头文件 #include<boost/noncopyable.hpp> 或 #include<boos ...
- 关联查询之map的延伸使用方法
<select id="front.sort.selectListall" parameterType="myshop.services.front.sort.be ...
- DotNetBar.Bar菜单的使用
DotNetBar.Bar菜单的使用 老帅 在C#中使用控件DevComponents.DotNetBar.Bar时,怎样设计菜单呢? 1.拖放生成一个菜单容器 拖放一个D ...
- Linux内核OOM机制的详细分析【转】
本文转载自:http://blog.csdn.net/liukuan73/article/details/43238623 Linux内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是并没 ...
- 【POJ 3744】 Scout YYF I
[题目链接] http://poj.org/problem?id=3744 [算法] 概率DP + 矩阵乘法 [代码] #include <algorithm> #include < ...