zoukankan      html  css  js  c++  java
  • P1434 滑雪

    P1434 滑雪

    题目描述

    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
    记忆化搜索,为什么能用记忆化搜索呢?
    首先我们在搜索每个点的最长路径时,可能有这种情况,第一条路径搜到了(x0,y0)这个点,然后dfs(x0,y0);这样就搜出了从(x0,y0)出发的最长路径,那么如果
    我们在搜第二条路径时或者搜从(x0,y0)出发的最长路径时,这次搜到的最长路径和第一次是一样的,所以我们可以用记忆化搜索。
     1 #include<cstdio>
     2 #include<algorithm>
     3 
     4 using namespace std ;
     5 const int MAXN = 110;
     6 int h[MAXN][MAXN];
     7 int f[MAXN][MAXN];
     8 int dx[4] = {0,0,1,-1};
     9 int dy[4] = {1,-1,0,0};
    10 bool v[MAXN][MAXN];
    11 int n,m,p,ans;
    12 
    13 void dfs(int x,int y,int cnt)
    14 {
    15     if (cnt>ans) ans = cnt;
    16     for (int i=0; i<4; ++i)
    17     {
    18         int xx = dx[i]+x;
    19         int yy = dy[i]+y;
    20         if (h[x][y]>h[xx][yy] && xx>0 && yy>0 && xx<=n && yy<=m && !v[xx][yy])
    21         {
    22             dfs(xx,yy,cnt+1);
    23         }
    24     }
    25 }
    26 int dfs(int x,int y)
    27 {
    28     for(int i=0; i<=3; i++)
    29     {
    30         int xx = dx[i]+x;
    31         int yy = dy[i]+y;
    32         if(xx>=1&&yy>=1&&xx<=n&&yy<=m)//判断是否出边界
    33         {
    34             if(h[x][y]>h[xx][yy])//判断是否小
    35             {
    36                 if(f[xx][yy]!=1) f[x][y]=max(f[xx][yy]+1,f[x][y]);//如果搜过了,就直接调用
    37                 else f[x][y]=max(dfs(xx,yy)+1,f[x][y]);//没搜过就搜
    38             }
    39         }
    40     }
    41     return f[x][y];//返回值
    42 }
    43 int main()
    44 {
    45     scanf("%d%d",&n,&m);
    46     for (int i=1; i<=n; ++i)
    47         for (int j=1; j<=m; ++j)
    48         {
    49             scanf("%d",&h[i][j]);
    50             f[i][j] = 1;
    51         }
    52     for (int i=1; i<=n; ++i)
    53         for (int j=1; j<=m; ++j)
    54         {
    55             int sum = dfs(i,j);
    56             ans = max(sum,ans);
    57         }
    58     printf("%d",ans);
    59     return 0;
    60 }
  • 相关阅读:
    iOS-Core-Animation-Advanced-Techniques(一)
    vue 路由
    Vue 生产环境部署
    vue 单文件组件
    vue 插件
    Vue 混合
    vue 自定义指令
    vue render函数 函数组件化
    vue render函数
    vue 过渡状态
  • 原文地址:https://www.cnblogs.com/mjtcn/p/7100776.html
Copyright © 2011-2022 走看看