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的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 ...
随机推荐
- response小结(二)——文件下载
我们先来看一个最简单的文件下载的例子: package com.yyz.response; import java.io.FileInputStream; import java.io.IOExcep ...
- orcale 循环插入 测试数据
以前开发一直用的是sql server 定义临时变量 循环插入数据到表中已经成为一种固定的模式,本来想orcale应该也一样吧 都是数据库.. 结果被现实无情的打击到了.在网上找办法,求大神 最后 ...
- Emmet的高级功能与使用技巧
Emmet系列教程 前端开发利器Emmet的介绍 Emmet快速编写HTML代码 Emmet快速编写CSS样式 Emmet快速编写CSS样式 编写好HTML和CSS代码时,我们也需要修改或添加一些内容 ...
- setTimeout、clearTimeout、setInterval,clearInterval ——小小计时器
先看下效果 话不多说上代码~ <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Typ ...
- [WCF]IIS部署到新系统
最近为以前的一个企业部署软件的时候,接触到WCF,通过博客园大佬的系列文章和一些书籍,基本了解了一些.简单说也算是SOA一种方式,提供某种服务,可以理解为一个类库,供其他项目使用,可以做到业务分离.但 ...
- md5值计算
1.md5(Message Digest 5th/消息概要加密算法 第5版) REFER: MD5 On wikipedia 2.应用范围 ① 验证下载文件的完整性 ② 3.关于MD5的几个问题 ①只 ...
- ZStack之ZDApp_Init解析
[注:本文源自博客园http://www.cnblogs.com/cherishui/,为尊重劳动者成果,如需转载请保留此行] 以下代码分析基于ZStack-CC2530-2.5.1a,开发环境为 I ...
- POJ 3928 Ping pong
题目链接:http://poj.org/problem?id=3928 乒乓比赛,有N个人参加,输入每个玩家的技能等级,对每个人设置一个特定ID和一个技能值,一场比赛需要两个选手和一个裁判,只有当裁判 ...
- vc++字符转换
测试环境: vs2008 开发语言:C++ #include <iostream>#include <windows.h>#include <string> // ...
- C++ 文件读写方案选型
严格来说, 有 3 种风格. UNIX 底层读写库 c 语言 stdio 标准库 iostream 流 一般的工程中, 底层读写库封装程度太低, 需要自己处理缓存和很多通用的异常场景. 不适合. 网络 ...