• skiing(搜索+记忆化搜索)


    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
    题解:题目让求滑雪最大距离,也就是最长递减长度;
    暴力搜索下竟然就过了,也可以用记忆化搜索做时间短了好多。
    dfs代码:
    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int INF=0xfffffff;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define SI(x) scanf("%d",&x)
    #define PI(x) printf("%d",x)
    typedef long long LL;
    const int MAXN=110;
    int ans;
    int mp[MAXN][MAXN];
    int disx[4]={0,0,1,-1};
    int disy[4]={1,-1,0,0};
    int R,C;
    void dfs(int x,int y,int step){
        ans=max(ans,step);
        for(int i=0;i<4;i++){
            int nx=x+disx[i],ny=y+disy[i];
            if(nx<0||nx>=R||ny<0||ny>=C)continue;
            if(mp[nx][ny]<mp[x][y])dfs(nx,ny,step+1);
        }
    }
    int main(){
        int T;
        SI(T);
        while(T--){
            scanf("%d%d",&R,&C);
            for(int i=0;i<R;i++)
                for(int j=0;j<C;j++)
                    SI(mp[i][j]);
                ans=0;
            for(int i=0;i<R;i++)
                for(int j=0;j<C;j++)
                    dfs(i,j,1);
                
                printf("%d
    ",ans);
        }
        return 0;
    }

     记忆化搜索:

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int INF=0xfffffff;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define SI(x) scanf("%d",&x)
    #define PI(x) printf("%d",x)
    typedef long long LL;
    const int MAXN=110;
    int ans;
    int mp[MAXN][MAXN];
    int disx[4]={0,0,1,-1};
    int disy[4]={1,-1,0,0};
    int dp[MAXN][MAXN];
    int R,C;
    int dfs(int x,int y,int step){
        if(dp[x][y])return dp[x][y];
        int len=1,maxlen=1;
        for(int i=0;i<4;i++){
            int nx=x+disx[i],ny=y+disy[i];
            if(nx<0||nx>=R||ny<0||ny>=C)continue;
            if(mp[nx][ny]<mp[x][y])len=dfs(nx,ny,step+1)+1;
            maxlen=max(maxlen,len);
        }
        dp[x][y]=maxlen;
        return dp[x][y];
    }
    int main(){
        int T;
        SI(T);
        while(T--){
            scanf("%d%d",&R,&C);
            for(int i=0;i<R;i++)
                for(int j=0;j<C;j++)
                    SI(mp[i][j]);
                ans=0;
                mem(dp,0);
            for(int i=0;i<R;i++)
                for(int j=0;j<C;j++)
                    ans=max(dfs(i,j,1),ans);
                
                printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    JAVA中将字符串按某一分隔符分隔为多个字符…
    ArcGis Server 中 如何在Task中实现 下拉列…
    ADF setWhereClause()
    把时间当作朋友(二)
    0606放手
    HtmlTextWriter类的学习
    过年了...
    过年了...
    HTML在线编辑器控件
    CSS中的滑动门技术
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5232524.html
Copyright © 2020-2023  润新知