POJ-1088 滑雪 (包含部分自用测试数据)
这题最简单的想法是深搜+记录,由于数据量比较小。这么做可以AC。如果在h大的情况下这种递归方法总会有一些问题。
如果转换一下,这个可以使用递推来解决,先对高度进行由低到高的排序,然后顺序对这些高度计算路径长度,可以通过数学归纳法证明此方法的合理性:
1、首先我们来考虑:一个高度如果是最小,那么由它开始的最长路径必然是1。因为它只能走到自己。
2、那么考虑高度第二小的值,首先它只比最小的那个高,那我们可以得出结论,如果它周围有最小的那个值,那么由它开始的路径长度是2,如果周围没有比它小的,那么路径长度为1。
假设N=m时,所有等于m或者比m小的高度都计算完最长路径,所有比m大的都还未被计算。那么当N=m+1时,记此高度的坐标为row,column,计算完的最长路径存放在way[r][c]中(way[i][j]初始值为-1)。
则way[row-1][column], way[row+1][column], way[row][column-1], way[row][column+1]4个相邻节点中,如果有way[x][y] + 1 > way[row][column],那么说明此节点的高度<=m+1,判断高度,如果小于则可以从[row,column]滑到[x,y],如果way[x][y]==-1,那么说明[x,y]点大于或等于[row,column],即使以后计算得出结果,也不能从[row,column]滑到[x,y],所以对[row,column]节点来讲,当前计算的最远路径满足完备性。可以根据之前计算的前m个高度获得最优解结果。
所以伪代码如下:
for (int i = ; i < r*c; i++){
找到h[i]对应的坐标
依次判断周围四个点的最长路径和高度
得出当前坐标的结果
}
这种方式的复杂度是:排序阶段O(NlogN),计算阶段是O(4N),所以总的复杂度是O(NlogN),在这个计算方式下数据范围远不止10000。
几个测试数据:
2 3
1 2 3
4 5 6
3 3
6 6 6
6 6 6
6 6 6
1 5
3 2 4 3 2
想了想还是贴个深搜吧,毕竟简单。
#include<stdio.h>
#include<stdlib.h> int a[][], way[][];
int r, c;
const int maxint = ; int findway(int i, int j){
if (way[i][j] > ) return way[i][j];
if (a[i-][j] < a[i][j])
if (findway(i-,j)+ > way[i][j])
way[i][j] = way[i-][j]+;
if (a[i+][j] < a[i][j])
if (findway(i+,j)+ > way[i][j])
way[i][j] = way[i+][j]+;
if (a[i][j-] < a[i][j])
if (findway(i,j-)+ > way[i][j])
way[i][j] = way[i][j-]+;
if (a[i][j+] < a[i][j])
if (findway(i,j+)+ > way[i][j])
way[i][j] = way[i][j+]+;
//printf("i=%d j=%d way=%d\n", i, j, way[i][j]);
return way[i][j];
} int main(){
int i, j, maxl;
maxl = ;
scanf("%d %d", &r, &c);
for (i = ; i <= r+; i++)
for (j = ; j <= c+; j++)
a[i][j] = maxint;
for (i = ; i <= r; i++)
for (j = ; j <= c; j++){
scanf("%d", &a[i][j]);
way[i][j] = -;
}
for (i = ; i <=r; i++)
for (j = ; j <= c; j++){
if ((a[i-][j] >= a[i][j])&&(a[i+][j] >= a[i][j])&&(a[i][j-] >= a[i][j])&&(a[i][j+] >= a[i][j]))
way[i][j] = ;
}
for (i = ; i <= r; i++)
for (j = ; j <= c; j++){
if (maxl < findway(i, j)) maxl = way[i][j];
}
printf("%d\n", maxl);
}
POJ-1088 滑雪 (包含部分自用测试数据)的更多相关文章
- POJ 1088 滑雪(记忆化搜索+dp)
POJ 1088 滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 107319 Accepted: 40893 De ...
- POJ 1088 滑雪(记忆化搜索)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 92384 Accepted: 34948 Description ...
- POJ 1088 滑雪 【记忆化搜索经典】
题目链接:http://poj.org/problem?id=1088 滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: ...
- POJ 1088 滑雪 -- 动态规划
题目地址:http://poj.org/problem?id=1088 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...
- OpenJudge/Poj 1088 滑雪
1.链接地址: bailian.openjudge.cn/practice/1088 http://poj.org/problem?id=1088 2.题目: 总Time Limit: 1000ms ...
- poj 1088 滑雪(区间dp+记忆化搜索)
题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程 ...
- POJ 1088 滑雪 (记忆化搜索)
题目链接:http://poj.org/problem?id=1088 题意很好懂,就是让你求一个最长下降路线的长度. dp[i][j]记录的是i j这个位置的最优的长度,然后转移方程是dp[i][j ...
- [ACM] poj 1088 滑雪 (内存搜索DFS)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 73409 Accepted: 27141 Description ...
- poj 1088 滑雪 DP(dfs的记忆化搜索)
题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 ...
随机推荐
- 学习之spring自带缓存
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://w ...
- C# @符号的多种使用方法
1.限定字符串用 @ 符号加在字符串前面表示其中的转义字符“不”被处理.如果我们写一个文件的路径,例如"D:/文本文件"路径下的text.txt文件,不加@符号的话写法如下:str ...
- (转)SQLSERVER表分区的介绍(一)
下面进入正题吧,很多时候当单张数据表的数据量比较大的时候比如千万级别条记录.上亿级别记录,如果不做优化,那么查询的效率大家清楚. 有经验的人会通过各种手段做优化,其中表分区就是其中一种手段. 个人对表 ...
- 写在十年 2007-09-15 (写给L之三)
你知道吗? 那种时间很远,但心很近的感觉. 时间已经远去了十年, 但亲切的感觉依然清晰可见, 无论时光远去了十年,二十年,三十年, 永远…… 它已经植根,在心间……
- CSMA-CA介绍
本文主要介绍通讯领域中CSMA相关机制,本文全部资料来自于网络. 网络通讯,必须依靠介质来传递数据,将数据调制到模拟信号上,再把此信号通过介质传递到远方.根据介质的不同,分为有线网络和无线网络.为 ...
- DQL_数据查询语言
2014年11月21日 21:43:53 DQL 基础查询-- 注意要点:1.用户友善的标题 ...
- div嵌套引起的margin-top不起作用(转)
嵌套div中margin-top转移问题的解决办法在这两个浏览器中,有两个嵌套关系的div,如果外层div的父元素padding值为0,那么内层div的margin-top或者margin-botto ...
- 导出excel表格
一. 1.获取数据源2.DataTable dt = st.Tables[0]; HttpResponse resp; // HTTP响应信息 resp = Page.Response; resp.C ...
- winform 与 html 交互 简单案例
本文主要简单的记录winform如何与html文件中的信息如何进行交互,即在winform中加载html界面,从而可以进行相互调用. 1.新建一个winform项目,若要在winform中加载html ...
- python学习之html从0开始(一)
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...