zoukankan      html  css  js  c++  java
  • Codevs 1958 刺激

    时间限制: 1 s    空间限制: 128000 KB    题目等级 : 黄金 Gold

    题目描述 Description

    saffah的一个朋友S酷爱滑雪,并且追求刺激(exitement,由于刺激过度导致拼写都缺了个字母),喜欢忽高忽低的感觉。现在S拿到了一张地图,试图制定一个最长路径。然而有的地图过于庞大,不易直接看出,所以S请来了saffah,saffah又请来了你向其帮忙。

    地图可抽象为一个M×N的矩阵,规定上北下南,左西右东。矩阵中的元素代表这个点的高度。由于S有特殊情况,出于对S的安全考虑,S只能向东滑,向南滑,或者就地停下。我们假定摩擦力可以忽略,那么S的机械能守恒,即S不可能到达比出发点高的地方。

    S可以从任意一点出发,到任意一点停止,除了遵守上述规则外,S还要求自己的路线必须是“一上一下一上一下”(这样才刺激对吧),即如果这一时刻比上一时刻的高度高,那么下一时刻只能滑到比这一时刻低的地方,或者停止;反之亦然。保证不会有相邻的两个高度相同的地方。

    现在S想知道,按照这个要求,最多能够经过几个点。(包括起点和终点)

    输入描述 Input Description

    输入文件的第一行有两个正整数M,N。

    接下来有M行,每行有N个整数,表示这一点的高度值Hi,j。

    输出描述 Output Description

    输出文件只有一行,为一个整数,为最大能够滑行经过的点数。

    样例输入 Sample Input

    4 5

    3 8 9 2 -1

    2 5 8 0 8

    8 0 1 2 3

    -2 1 9 -1 0

    样例输出 Sample Output

    7

    数据范围及提示 Data Size & Hint

    说明: 满足题意的最长路径为8→5→8→0(或1),共经过了7个点。可以证明,没有更长的路径存在。

    对于100%的数据,-2×109≤Hi,j≤2×109。

    对于30%的数据,M=N≤5;对于50%的数据,M+N≤25;对于70%的数据,M+N≤50;对于100%的数据,M+N≤100。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 long long map[102][102];
     6 int n,m,ans=0,all;
     7 void dfs(int x,int y,int kt,bool ciji)
     8 {
     9     ans=max(ans,kt);
    10     if(ciji)
    11     {
    12         if(x+1<=n&&map[x+1][y]>map[x][y]&&map[x+1][y]<=all) dfs(x+1,y,kt+1,!ciji);
    13         if(y+1<=m&&map[x][y+1]>map[x][y]&&map[x][y+1]<=all) dfs(x,y+1,kt+1,!ciji);
    14     }
    15     else
    16     {
    17         if(x+1<=n&&map[x+1][y]<map[x][y]&&map[x+1][y]<=all) dfs(x+1,y,kt+1,!ciji);
    18         if(y+1<=m&&map[x][y+1]<map[x][y]&&map[x][y+1]<=all) dfs(x,y+1,kt+1,!ciji);
    19     }
    20 }
    21 int main()
    22 {
    23     memset(map,0,sizeof(map));
    24     scanf("%d%d",&n,&m);
    25     for(int i=1;i<=n;i++)
    26         for(int j=1;j<=m;j++)
    27             scanf("%lld",&map[i][j]);
    28     for(int i=1;i<=n;i++)
    29     {
    30         for(int j=1;j<=m;j++)
    31         {
    32             all=map[i][j];
    33             dfs(i,j,1,false);// ciji==true 高 fasle 低 
    34         }
    35     }
    36     printf("%d",ans);
    37     return 0;
    38 }

    思路:简单的搜索,设置一个Bool变量,标记一下下一个应该是大还是小,all表示起点的高度,想写记忆化来,没写,照样能跑过,记忆话应该更快~~

  • 相关阅读:
    前端与算法 leetcode 344. 反转字符串
    JavaScript闭包使用姿势指南
    前端与算法 leetcode 48. 旋转图像
    前端与算法 leetcode 36. 有效的数独
    前端与算法 leetcode 1. 两数之和
    前端与算法 leetcode 283. 移动零
    前端与编译原理 用js去运行js代码 js2run
    前端与算法 leetcode 66. 加一
    前端与算法 leetcode 350. 两个数组的交集 II
    前端与算法 leetcode 26. 删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6156288.html
Copyright © 2011-2022 走看看