zoukankan      html  css  js  c++  java
  • P1434 [SHOI2002]滑雪 dfs

      

    题目描述

    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(从24开始,在1结束)。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

    输入输出格式

    输入格式:

    输入的第一行为表示区域的二维数组的行数R和列数C(1≤R,C≤100)。下面是R行,每行有C个数,代表高度(两个数字之间用1个空格间隔)。

    输出格式:

    输出区域中最长滑坡的长度。

    输入输出样例

    输入样例#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
    
    输出样例#1: 复制
    25

    记忆化搜索

    和之前做的周练水流很像
    搜索最长的路即可
    我可能用了效率最低的方法。。。强行dfs 32ms
    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);i--)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define inf 0x3f3f3f3f
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define N 105
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    int n,m;
    int mp[N][N];
    bool inmap(int x,int y)
    {
        return x>=1&&x<=n&&y>=1&&y<=m;
    }
    int maxx=-1;
    int d[N][N];
    
    void dfs(int x,int y,int cnt)
    {
        if(cnt>=d[x][y])d[x][y]=cnt,maxx=max(maxx,cnt);
        else return  ;
        rep(i,0,3)
        {
            int a=x+dx[i];
            int b=y+dy[i];
            if(!inmap(a,b))continue;
            if(mp[a][b]<=mp[x][y])continue;
            if(cnt+1<=d[a][b])continue;//如果步数更小或者相等 其实已经没有必要继续了
    
            dfs(a,b,cnt+1);
        }
        return ;
    }
    
    int main()
    {
        RII(n,m);
        rep(i,1,n)
        rep(j,1,m)
        RI(mp[i][j]),d[i][j]=1;
        rep(i,1,n)
        rep(j,1,m)
        if(d[i][j]==1)
        dfs(i,j,1);
        cout<<maxx;
    }
    View Code

    也可以将高度从小到大排序然后进行dp(为了保持其有序性)

    其实速度也差不多  



  • 相关阅读:
    Cocos Creator 镜头跟随(cc.follow)
    Cocos Creator 虚拟摇杆
    Creator Cocos 获取舞台尺寸 (屏幕大小)
    Cocos Creator中的计时器 (setTimeOut ,setInterval,Schedule )
    Cocos Creator Touch_End的触发条件 (Mouse事件)
    Cocos Creator Spine骨骼动画 (局部换装、全局换装)
    Cocos Creator 粒子效果
    Cocos Creator 的Http和WebSocket
    Android中图表AChartEngine学习使用与例子
    Android应用加入微信分享
  • 原文地址:https://www.cnblogs.com/bxd123/p/10663750.html
Copyright © 2011-2022 走看看