`

1088(动态规划)

阅读更多
总时间限制:
1000ms
内存限制:
65536kB
描述
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更长。事实上,这是最长的一条。
输入
输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
输出
输出最长区域的长度。
样例输入
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
样例输出
25

算法思想非常重要

动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。在求解过程中,该方法也是通过求解局部子问题的解达到全局最优解,但与分治法和贪心法不同的是, 动态规划允许这些子问题不独立,也允许其通过自身子问题的解作出选择,该方法对每一个子问题只解一次,并将结果保存 起来,避免每次碰到时都要重复计算。子问题的重叠性 动态规划算法的关键在于解决冗余,这是动态规划算法的根本目的。

 

 

解决方案:G++

/**
动态规划
*/
#include<iostream>
using namespace std ;
#define MAX 101
int height[MAX][MAX];
int steps[MAX][MAX];
int R,C ;
int searchSteps(int i,int j)//递归求解
{
   int a[4],k,max=0;
   if(steps[i][j] != -1) //已经经过这个点
        return steps[i][j] ;
   if(i<0||j<0||i>=R||j>=C) //越界
     return 0 ;
   else{

        if(height[i+1][j]>=height[i][j]) a[0] = 0 ;
        else a[0] = searchSteps(i+1,j) ;

        if(height[i-1][j]>=height[i][j]) a[1] = 0 ;
        else a[1] = searchSteps(i-1,j) ;

        if(height[i][j+1]>=height[i][j]) a[2] = 0 ;
        else a[2] = searchSteps(i,j+1) ;

        if(height[i][j-1]>=height[i][j]) a[3] = 0 ;
        else a[3] = searchSteps(i,j-1) ;
       }
   for(k=0;k<4;k++)
    {
     if(a[k]>max) max = a[k] ;
    }
    steps[i][j] = max+1 ;
    return max+1 ;
}
int main()
{
    cin>>R>>C ;
    int i,j,max=0;
    for(i=0;i<R;i++)
    for(j=0;j<C;j++)
    {
        cin>>height[i][j] ;
        steps[i][j] = -1 ;
    }
   for(i=0;i<R;i++)
    for(j=0;j<C;j++)
    {
        if(searchSteps(i,j)>max)
            max = searchSteps(i,j) ;
    }

   cout<<max<<endl ;



}

 

分享到:
评论

相关推荐

    动态规划算法poj1088滑雪实验报告

    动态规划算法poj1088滑雪实验报告 动态规划算法poj1088滑雪实验报告

    经典动态规划合集_牛人 树形,压缩 老题

    典型的动态规划,用递归下的记忆化搜索来实现 1088 POJ 动态规划加速原理之四边形不等式 基于连通性状态压缩的动态规划问题 对一些DP题目的小结 树型动态规划 树型动态规划和状态压缩动态规划 算法导论第15章-动态...

    poj经典动态规划题目解题报告

    可以作为学习动态规划系统的资料,包括题目: Pku acm 1179 Polygon Pku acm 1125 Stockbroker Grapevine Pku acm 1160 post office Pku acm 1014 Dividing Pku acm 1050 To the Max Pku acm 1088...

    pku acm 1088 滑雪c代码

    pku acm 第1088题 滑雪c代码,含有详细注释,算法:动态规划

    pku 1088 java 答案

    pku 1088 java 答案,使用动态规划解决问题:

    Poj动态规划题目列表

    容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈), 1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, ...

    坐标型DP问题的解题思想及思路

    坐标型动态规划 poj1191棋盘分割 poj1088滑雪 noi过河卒 动态规划的解题思想及思路

    acm_problems:刷题!!!

    #POJ 题集 数论 欧几里得/拓展欧几里得算法 ...动态规划 背包 1014 高精度 加减乘除 1001 巧妙处理 思维处理 1852 模拟 1017 简单题 水题 1004 1007 1008 枚举 1013 预处理 1002 二分查找 1003 1005 ###贪心 1089

    C语言通用范例开发金典.part2.rar

    范例1-40 动态堆栈 90 ∷相关函数:push函数 Pop函数 1.3.10 动态队列 93 范例1-41 动态队列 93 ∷相关函数:Enqueue函数 1.3.11 初始化单循环链表 95 范例1-42 初始化单循环链表 95 ∷相关函数:ListLength...

    C语言通用范例开发金典.part1.rar

    范例1-40 动态堆栈 90 ∷相关函数:push函数 Pop函数 1.3.10 动态队列 93 范例1-41 动态队列 93 ∷相关函数:Enqueue函数 1.3.11 初始化单循环链表 95 范例1-42 初始化单循环链表 95 ∷相关函数:ListLength...

    C 开发金典

    范例1-40 动态堆栈 90 ∷相关函数:push函数 Pop函数 1.3.10 动态队列 93 范例1-41 动态队列 93 ∷相关函数:Enqueue函数 1.3.11 初始化单循环链表 95 范例1-42 初始化单循环链表 95 ∷相关函数:ListLength_...

    ZJU_ACM_All_Anwer 搞编程的都知道的浙江大学A 题库.本书 集了所有经 Z 题解集,集合并附 Mathimaticsumerical algorithms 数值算法

    动态规划: 1011 NTA 简单题 1013 Great Equipment 简单题 1024 Calendar Game 简单题 1027 Human Gene Functions 简单题 1037 Gridland 简单题 1052 Algernon s Noxious Emissions 简单题 1409 ...

    浙江大学ACM题解/ZJU 题型分类

    动态规划: 1011 NTA 简单题 1013 Great Equipment 简单题 1024 Calendar Game 简单题 1027 Human Gene Functions 简单题 1037 Gridland 简单题 1052 Algernon s Noxious Emissions 简单题 1409 ...

Global site tag (gtag.js) - Google Analytics