动态规划(1)--滑雪

skiing

时间限制:3000 ms  |  内存限制:65535 KB

难度:5

描述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。
后面是下一组数据;

输出

输出最长区域的长度。

样例输入

1
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

思路:用一个二维矩阵gaodu[][]来存储输入进来的数据,用一个一维数组shunxu[]来将gaodu矩阵里的数据进行带横纵坐标的排序,一维数组可以使用一个自己定义的结构体类型。用另外一个二维数组lujing[][]来进行记录gaodu数组对应点上可以滑行的最长距离。对gaodu数组中的数据都排完顺序之后,选择最小的一个在gaodu数组中进行四周的比对。gaodu[i][j]与四周:上gaodu[i-1][j],下gaodu[i+1][j],左gaodu[i][j-1],右gaodu[i][j+1]进行比较,上下左右某一点如果>gaodu[i][j],则可走。最初初始化lujing[][]的矩阵的时候,lujing[][]所有元素都为0,当且仅当(上下左右某点x点>gaodu[i][j]&&lujing[i][j]+1>x点对应lujing上记录的值得时候),将lujing上的点更新。依次遍历所有shunxu中的值,将lujing的矩阵填数完毕,再获得lujing矩阵的最大值,也就得到了题目要求的路径的最大长度。

AC代码如下:

#include
#include
#include 
#include
#include
#include
using namespace std;
int gaodu[105][105];
int lujing[105][105];
int fangxiang[4][2]={{1,0},
                    {-1,0},
                    {0,1},
                    {0,-1}};
static int MAX_NUM=10005;
struct sz
{
    int x;
    int y;
    int z;       
} shunxu[MAX_NUM];
int cmp(sz a,sz b)
{
    if(a.zshunxu[i].z&&(lujing[zhongx][zhongy]+1)>lujing[xx][yy])
                    lujing[xx][yy]=lujing[zhongx][zhongy]+1;
            }
        }
        int max=0;
        for(int i=0;imax)
                    max=lujing[i][j];
            }
        }
        printf("%d\n",max+1);
    } 
    system("pause");    
    return 0;
} 

 2014-05-04 14:07:45

转载于:https://www.cnblogs.com/xueniwawa/p/3706720.html

你可能感兴趣的:(动态规划(1)--滑雪)