poj1088 经典DP
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 88296 | Accepted: 33100 |
Description
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
Input
Output
Sample Input
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
Sample Outpu25
题目大意:汉语的,很好懂,就是让你求最长的递减路径有多长,注意是求下降的次数而不是下降的距离。
思路分析:第一感觉dfs可以做,但是做该题之前发现这道题是归到DP里面的,正好刚学习了一些DP的知识,这道题也算是正式做的第一道DP题目吧,
首先要确定状态,在本题中每一点的状态就是以该点为最高点可以下降的最长路径,然后要明确一状态是如何进行转移的,以数组f来记录每一点的状态,
避免重复搜索,这一点要优于DFS,简单分析我们就可以找到递推关系,f[i][j]=max{f[i-1][j],f[i][j-1],f[i][j+1],f[i+1][j]}+1,代码的实现就要容易
的多了,但是弱在写dp函数判定是否状态转移的时候把行和列搞反了,wa了几发,做题一定要谨慎啊!
代码:
/*dp,记忆化搜索
首先应该确定状态
用数组来保存每一点的状态,
状态的转移在dp函数中已经给出
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
const int maxn=110;
int m[maxn][maxn],f[maxn][maxn];//f数组代表以该点为最高点的最多的步数
int R,C;
int dp(int x,int y)
{
if(f[x][y]) return f[x][y];//避免重复搜索
f[x][y]=1;//每一点下滑梯数最小为1
if(x>=1&&m[x][y]>m[x-1][y]) f[x][y]=max(f[x][y],dp(x-1,y)+1);
if(y>=1&&m[x][y]>m[x][y-1]) f[x][y]=max(f[x][y],dp(x,y-1)+1);
if(x<R-1&&m[x][y]>m[x+1][y]) f[x][y]=max(f[x][y],dp(x+1,y)+1);
if(y<C-1&&m[x][y]>m[x][y+1]) f[x][y]=max(f[x][y],dp(x,y+1)+1);
return f[x][y];
}
int main()
{
int i,j;
scanf("%d%d",&R,&C);
memset(f,0,sizeof(f));
for(i=0;i<R;i++)
for(j=0;j<C;j++)
cin>>m[i][j];
for(i=0;i<R;i++)
for(j=0;j<C;j++)
dp(i,j);
int t=f[0][0];
for(i=0;i<R;i++)
for(j=0;j<C;j++)
if(t<f[i][j]) t=f[i][j];
cout<<t<<endl;
return 0;
}
poj1088 经典DP的更多相关文章
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- poj1458 求最长公共子序列 经典DP
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45763 Accepted: 18 ...
- NYOJ - 矩形嵌套(经典dp)
矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...
- 51nod 1412 AVL树的种类(经典dp)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...
- NYOJ 16 矩形嵌套(经典DP)
http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度: ...
- poj 1050 To the Max 最大子矩阵和 经典dp
To the Max Description Given a two-dimensional array of positive and negative integers, a sub-rect ...
- CS Academy Distinct Neighbours(经典dp)
CS Academy Distinct Neighbours(经典dp) 题意: 求相邻无相同数字的合法的排列数 题解: 题解 先将相同的数字分为一类,假设共有n组 定义\(dp[i][j]\)表示前 ...
- 【经典dp 技巧】8.13序列
经典的拆绝对值 题目大意 给定$n$个具有顺序的序列,允许对每个序列循环移动.记第$i$个序列尾元素为$x$,$i+1$个序列首元素为$y$,定义其连接收益为$|x-y|*i$,求$n$个序列连接最大 ...
- POJ 1160:Post Office 邮局经典DP
Post Office Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17168 Accepted: 9270 Desc ...
随机推荐
- Java中的Clone机制(浅层复制)
浅层复制代码: import java.util.*; class Int{ private int i; public Int(int ii){i = ii;} public void increm ...
- Lightoj1009 Back to Underworld(带权并查集)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Back to Underworld Time Limit:4000MS ...
- C语言中对于结构的定义一般放在.h中还是.c中
单文件使用的结构体放.c文件中 本模块内部使用结构体,放模块内部头文件中 供外部使用的结构体,放模块对外头文件中.
- 慕课linux学习笔记(九)常用命令(6)
关机与重启命令 Shutdown [选项] 时间 -c 取消前一个关机命令 -h 关机 -r 重启 Shutdown -r now 其他关机命令 Halt Poweroff Init 0 其他重启命令 ...
- 使用apache的ab对页面进行压力测试
ab是apache自带的一个很好用的压力测试工具,当安装完apache的时候,就可以在bin下面找到ab 我们可以模拟100个并发用户,对一个页面发送1000个请求 ./ab -n1000 -c100 ...
- Monkey and Banana(HDU 1069 动态规划)
Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- AltiumDesignerSummer9Build9.3.1.19182破解图文教程
一.下载 AltiumDesignerSummer9Build9.3.1.19182 下载地址 http://www.verycd.com/topics/2769819/ 二.安装 一路确定啥的傻瓜式 ...
- Windows下连接php5.3+sql server2008
php连接sql server真是一件闹心的事, 折腾了许久,今天有了点起色,还是不错的. mssql extension is not available anymore on Windows wi ...
- UML--核心元素之包
包是一种容器,如同文件夹一样. 包是UML非常常用的一个元素,它最主要的作用就是容纳并为其他元素分类.包可以容纳用例.业务实体.类图等,也包含子包. 分包的原则 1.如果将元素分为三个包A.B.C,那 ...
- 深入浅出Node.js (4) - 异步编程
4.1 函数式编程 4.1.1 高阶函数 4.1.2 偏函数用法 4.2 异步编程的优势与难点 4.2.1 优势 4.2.2 难点 4.3 异步编程解决方案 4.3.1 事件发布/订阅模式 4.3.2 ...