• 动态规划(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<stdio.h>
    #include<stdlib.h>
    #include<string.h> 
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    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.z<b.z)
            return 1;
        else
            return 0;
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        while(n--)
        {
            memset(gaodu,0,sizeof(gaodu));
            memset(lujing,0,sizeof(lujing));
            for(int i=0;i<MAX_NUM;i++)
            {
                shunxu[i].x=0;
                shunxu[i].y=0;
                shunxu[i].z=0;        
            }
            int r,c;
            scanf("%d%d",&r,&c);
            for(int i=0;i<r;i++)
            {
                for(int j=0;j<c;j++)
                {
                    scanf("%d",&gaodu[i][j]);
                    shunxu[i*r+j].z=gaodu[i][j];
                    shunxu[i*r+j].x=i;
                    shunxu[i*r+j].y=j;
                }
            }
            sort(shunxu,shunxu+r*c,cmp);
            for(int i=0;i<r*c;i++)
            {
                int zhongx=shunxu[i].x;
                int zhongy=shunxu[i].y;
                for(int j=0;j<4;j++)
                {
                    int xx=zhongx+fangxiang[j][0];        
                    int yy=zhongy+fangxiang[j][1];
                    if(gaodu[xx][yy]>shunxu[i].z&&(lujing[zhongx][zhongy]+1)>lujing[xx][yy])
                        lujing[xx][yy]=lujing[zhongx][zhongy]+1;
                }
            }
            int max=0;
            for(int i=0;i<r;i++)
            {
                for(int j=0;j<c;j++)
                {
                    if(lujing[i][j]>max)
                        max=lujing[i][j];
                }
            }
            printf("%d
    ",max+1);
        } 
        system("pause");    
        return 0;
    } 
    

     2014-05-04 14:07:45

  • 相关阅读:
    获取本机ip地址以及主机名称
    java导出excel
    plsql连接远程数据库
    Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use.解决办法
    导出项目文件到本地指定目录(zip)
    java集合对字符串或对象去重
    js文字转语音播放
    java实现的Excel批量导入
    字符串分割的实现
    所生成项目的处理器架构“MSIL”与 “x86”不匹配
  • 原文地址:https://www.cnblogs.com/xueniwawa/p/3706720.html
Copyright © 2020-2023  润新知