Poj_1088_滑雪(DP)
一、Description(poj1088)
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
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
输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
Output
输出最长区域的长度。
二、问题分析
典型的DP问题,动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再合并子问题的解以得出原问题的解。 通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量: 一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。
解这个问题与解其它的DP问题几乎没有什么两样。第一步找到问题的“状态”,第二步找到“状态转移方程”,然后基本上问题就解决了。首先,我们要找到这个问题中的“状态”是什么?我们必须注意到的一点是,到达一个坐标的方式最多有四种:上下左右四个方向,而且值必须必坐标值要大。然后再从这四个来源中选取符合要求的点,并从中选出S[i][j]最大的,也就是路径长度最长的,而所选出的这个坐标又可以当成是一个子问题递归求解。由于使用了记忆化存储,所以可以先直接查表,如果表中存在子问题的解则直接返回,否则就按上面的分析过程找到最大路径并存储。经过上面的分析,很容易可以得出问题的状态和状态转移方程。
S[i][j]=1 + max(S[i-1][j], if i>0 ; S[i][j-1], if j>0;S[i+1][j] , if i<m-1 ; S[i][j+1], if j<n-1 )
三、解决方案
有了上面的分析,编码就比较简单了。用一个二维数组用于读取坐标,再用一个二维数组用于记忆化存储。再写一个方法计算每一个坐标的值,并从四个方向分析上一步的最大值,并递归调用方法。算出本坐标的最大值并存储。最后,找出S数组中的最大值即是所求的最大路径。
import java.util.Scanner;
public class N1088_skate{
private int h[][]=new int[101][101];
private int m[][]=new int[101][101];
private int r,c; private void init(){
Scanner sc=new Scanner(System.in);
r=sc.nextInt();
c=sc.nextInt();
for(int i=0;i<r;i++)
for(int j=0;j<c;j++){
h[i][j]=sc.nextInt();
m[i][j]=-1;
}
} //递归获取从点(i,j)出发滑行的最大长度
public int searchWithMenmo(int x,int y){
if( m[x][y]!=-1)
return m[x][y];
else{
int max=0;
if(x>=1){
if(h[x-1][y]>h[x][y]){
max=Math.max(max,searchWithMenmo(x-1,y));
}
}
if(y>=1){
if(h[x][y-1]>h[x][y]){
max=Math.max(max,searchWithMenmo(x,y-1));
}
}
if(x<r-1){
if(h[x+1][y]>h[x][y]){
max=Math.max(max,searchWithMenmo(x+1,y));
}
}
if(y<c-1){
if(h[x][y+1]>h[x][y]){
max=Math.max(max,searchWithMenmo(x,y+1));
}
}
m[x][y]=max+1;
return m[x][y];
}
} public int getMaxHeight(){
int temp;
int Max=-1;
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
temp=searchWithMenmo(i,j);
if(Max< temp)
Max=temp;
}
}
return Max;
}
public static void main(String args[]){
N1088_skate m=new N1088_skate();
m.init();
System.out.println(m.getMaxHeight());
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
Poj_1088_滑雪(DP)的更多相关文章
- POJ - 1088 滑雪 dp
http://bailian.openjudge.cn/practice/1088?lang=en_US 题解: 设一个dp[N][N]数组代表从(i,j)坐标开始能滑到的最远距离.更新的方法为 遍历 ...
- poj 1088 滑雪 DP(dfs的记忆化搜索)
题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 ...
- poj1088 滑雪 dp+dfs记忆化
简单的搜索,不必多说了,初始状态下每个点能到达的长度是1,它本身.还有,注意关掉文件重定向,被坑好多次了. 代码如下: #include<cstdio> #include<algor ...
- 动态规划 DP
10.1.5.253 1143 数字金字塔#include <iostream> #include<string.h> using namespace std; int a[1 ...
- 【USACO】滑雪课程
滑雪课程贝西去科罗拉多州去滑雪,不过还她不太会玩,只是个能力为 1 的渣渣.贝西从 0 时刻进入滑雪场,一到 T 时刻就必须离开.滑雪场里有 N 条斜坡,第 i 条斜坡滑行一次需要 Di 分钟,要求游 ...
- 各种背包的dp刷题板
[p1332][NYOJ skiing] 滑雪 (dp+搜索) [p1312] [vjios1448 路灯改建计划] 关灯问题 (背包预处理的分组背包) f[i][j]表示给把前i个灯分为j组可以获 ...
- 滑雪(简单dp)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 81099 Accepted: 30239 Description Mic ...
- POJ1088滑雪(dp+记忆化搜索)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 86411 Accepted: 32318 Description ...
- POJ 1088 滑雪 记忆化DP
滑雪 Time Limit: 1000MS Memory Limit: 65536K Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度 ...
随机推荐
- 常用string函数分析
string函数分析string函数包含在string.c文件中,经常被C文件使用.1. strcpy函数原型: char* strcpy(char* str1,char* str2);函数功能: 把 ...
- Gmail上不去怎么办?
近期非常多人反映Gmail上不去.每到重大政治事件附近,国家的防火墙就会加固一些. 事实上仅仅要下一个软件就能够轻松解决Google.Gmail上不去的问题. 下载地址 下载解压后点击"我要 ...
- SkipList跳跃表(Java实现)
取自网络https://github.com/spratt/SkipList AbstractSortedSet.java package skiplist_m; /***************** ...
- C++复习:位运算
与 a&b : 1010&1100=1000 或 a|b : 1010|1100=1110 异或 a^b : 101 ...
- c++ 通过数据流方式实现文件拷贝
#include "stdafx.h"#include <iostream>#include<fstream>using namespace std;voi ...
- vue 后台交互数据-编辑页面
思路~点击编辑按钮,需要获取当前列的id,然后根据id请求后台当前id的数据 1.~~ 2.接收id,并请求页面 获取数据
- maven官网下载安装步骤
第一大步:下载. a.俗话说:“巧妇难为无米之炊”嘛!我这里用的是 ZIP Archive 版的,win7 64位的机器支持这个,所以我建议都用这个.因为这个简单嘛,而且还干净. 地址见图 拉倒最下面 ...
- iOS10.3 UILable中划线失效问题
iOS10.3系统的一个Bug,在UILable中含有中文时,中划线会失效 NSString *priceStr = [NSString stringWithFormat:@"%.2f元&q ...
- Python中的staticmethod和classmethod
谈谈Python中的staticmethod和classmethod 首先值得说明的是staticmethod和classmethod都是python中定义的装饰器,用的时候需要在前面加@ 即@sta ...
- 【题解】Cats Transport (斜率优化+单调队列)
[题解]Cats Transport (斜率优化+单调队列) # When Who Problem Lang Verdict Time Memory 55331572 Jun/09/2019 19:1 ...