这题最简单的想法是深搜+记录,由于数据量比较小。这么做可以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 滑雪 (包含部分自用测试数据)的更多相关文章

  1. POJ 1088 滑雪(记忆化搜索+dp)

    POJ 1088 滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 107319   Accepted: 40893 De ...

  2. POJ 1088 滑雪(记忆化搜索)

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 92384   Accepted: 34948 Description ...

  3. POJ 1088 滑雪 【记忆化搜索经典】

    题目链接:http://poj.org/problem?id=1088 滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:  ...

  4. POJ 1088 滑雪 -- 动态规划

    题目地址:http://poj.org/problem?id=1088 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  5. OpenJudge/Poj 1088 滑雪

    1.链接地址: bailian.openjudge.cn/practice/1088 http://poj.org/problem?id=1088 2.题目: 总Time Limit: 1000ms ...

  6. poj 1088 滑雪(区间dp+记忆化搜索)

    题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程 ...

  7. POJ 1088 滑雪 (记忆化搜索)

    题目链接:http://poj.org/problem?id=1088 题意很好懂,就是让你求一个最长下降路线的长度. dp[i][j]记录的是i j这个位置的最优的长度,然后转移方程是dp[i][j ...

  8. [ACM] poj 1088 滑雪 (内存搜索DFS)

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 73409   Accepted: 27141 Description ...

  9. poj 1088 滑雪 DP(dfs的记忆化搜索)

    题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 ...

随机推荐

  1. ubuntu(16.04.01)学习-day2

    1.建立硬链接: ln main.c mainsoft 2.建立软链接:ln -s main.c soft 3.对文档进行统计 wc main.c返回行.单词数和字符数 4.查看相应命令的描述 wha ...

  2. asp.net C#数据导出Excel实例介绍

    excel导出在C#代码中应用己经很广泛了,我这里就做些总结,供自己和读者学习用. Excel知识点. 一.添加引用和命名空间 添加Microsoft.Office.Interop.Excel引用,它 ...

  3. Redis rdb文件CRC64校验算法 Java实现

    查看RDB文件结构,发现最后的8字节是CRC64校验算得,从文件头开始直到8字节校验码前的FF结束码(含),经过CRC64校验计算发现,貌似最后的8字节是小端模式实现的. 参考redis的crc64实 ...

  4. 非Page类使用session(Httpcontext.session和page.session区别)

    ASP.NET中Session高级使用技巧 在开发Aspx .NET软件时,有时需要把常用的东西封装到一个非PAGE类中,文章介绍在非Page类中使用Session的方法. 一.PAGE参数法: 1. ...

  5. Cocos2d-x中__Dictionary容器以及实例介绍

    __Dictionary类在Cocos2d-x 2.x时代它就是CCDictionary类,它是模仿Objective-C中的NSDictionary类而设计的,通过引用计数管理内存.__Dictio ...

  6. spring集合类型的setter注入的一个简单例子

    在项目中我们有时候会为集合类型设定一些默认的值,使用spring后,我们可以通过配置文件的配置,用setter方式为对象的集合属性提供一些默认值,下面就是一个简单的例子. 首先我们创建了一个名为Col ...

  7. C 再识数组指针 指针数组的概念

    参考出处: http://www.cnblogs.com/mq0036/p/3382732.html http://www.cnblogs.com/hongcha717/archive/2010/10 ...

  8. jquery——ajax加载后的内容,单击事件失效

    使用delegate(),on()绑定事件,可以将事件绑定到其祖先元素上,这样以后加载出来的元素,单击事件仍然有效

  9. Winform ComboBox控件高亮显示

    //重绘下拉表单窗口,需要在窗口设计代码中加入下面这一句 this.cmdChannelName.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawF ...

  10. 写了个Linux包过滤防火墙

    花几天写了个so easy的Linux包过滤防火墙,估计实际意义不是很大.防火墙包括用户态执行程序和内核模块,内核模块完全可以用iptable代替.由于在编写的过程一开始写的是内核模块所以就直接用上来 ...