zoukankan      html  css  js  c++  java
  • skiing

    【动态规划】skiing

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 29  解决: 12
    [提交][状态][讨论版]

    题目描述

    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
    

    搜索一遍 用dp数组记录一边。记忆化搜索
    #include <cstring>
    #include <vector>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <queue>
    #define fi first
    #define se second
    #define pi pair<int,int>
    #define md make_pair
    #define ha pair<int,pair<int,pi> >
    using namespace std;
    const int inf=0x3f3f3f3f;
    int maze[105][105], dp[105][105];
    int r,c,t,ans,dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
    int dfs(int i,int j){
        if(dp[i][j]>0)return dp[i][j];
    
        int nx,ny,mx=1;
        for(int x=0;x<4;x++){
            nx=i+dx[x],ny=j+dy[x];
            if(nx>0&&nx<=r&&ny>0&&ny<=c){
                if(maze[i][j]>maze[nx][ny]){
                    int m = dfs(nx,ny)+1;
                    mx = mx>m ? mx:m;
                }
            }
        }
        return dp[i][j]=mx;
    }
    int main()
    {
        freopen("data.in","r",stdin);
        scanf("%d",&t);
        while(t--){
            //int mx,my,mm=0;
            scanf("%d%d",&r,&c);
            for(int i=1;i<=r;i++){
                for(int j=1;j<=c;j++){
                    scanf("%d",&maze[i][j]);
                    //if(maze[i][j]>mm)  mm=maze[i][j], mx = i,my=j;
                    dp[i][j]=0;
                }
            }
            //printf("%d %d 
    ",mx,my);
            for(int i=1;i<=r;i++){
                for(int j=1;j<=c;j++){
                    dp[i][j] = dfs(i,j);
                    ans= max(ans,dp[i][j]);
                }
            }
            //dfs(mx,my);这么做提交ac也是醉了
            printf("%d
    ",ans);
        }
    }
  • 相关阅读:
    多线程 execute和submit区别和使用
    Linux上安装rz和sz命令
    杜恩德__百度百科
    电商类-高并发场景处理方式一
    ConcurrentHashMap源码分析(1.8)
    JVM | 为何生产环境最好保持 Xms = Xmx
    分享ProcessOn网上的干货模板
    pythonweb开发
    pyquery
    python正则
  • 原文地址:https://www.cnblogs.com/acmtime/p/5733637.html
Copyright © 2011-2022 走看看