P1732 活蹦乱跳的香穗子

题目描述

香穗子在田野上调蘑菇!她跳啊跳,发现自己很无聊,于是她想了一个有趣的事情,每个格子最多只能经过1次,且每个格子都有其价值

跳的规则是这样的,香穗子可以向上下左右四个方向跳到相邻的格子,并且她只能往价值更高(这里是严格的大于)的格子跳.

香穗子可以从任意的格子出发,在任意的格子结束,

那么她最多能跳几次?

输入输出格式

输入格式:

第一行n,m,表示田野的长和宽

接下来n行,每行m个数,表示该格的价值

输出格式:

一个数,表示最多跳得次数

输入输出样例

输入样例#1:
2 2
2 5
-1 3
输出样例#1:
2

说明

n,m<=100

答案保证小于Maxlongint

决定了,

以后能写记忆化搜索的写记忆化搜索

不能写记忆化搜索的也写记忆化搜索!

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<algorithm>
 7 #define lli long long int 
 8 using namespace std;
 9 const int MAXN=101;
10 void read(lli &n)
11 {
12     char c='+';lli x=0;bool flag=0;
13     while(c<'0'||c>'9')
14     {c=getchar();if(c=='-')flag=1;}
15     while(c>='0'&&c<='9')
16     {x=x*10+(c-48);c=getchar();}
17     flag==1?n=-x:n=x;
18 }
19 lli n,m;
20 lli map[MAXN][MAXN];
21 lli ans[MAXN][MAXN];
22 lli xx[5]={-1,+1,0,0};
23 lli yy[5]={0,0,-1,+1};
24 lli M_S(lli x,lli y)
25 {
26     if(ans[x][y])
27         return ans[x][y];
28     for(lli i=0;i<4;i++)
29     {
30         lli wx=x+xx[i];
31         lli wy=y+yy[i];
32         if(map[wx][wy]>map[x][y]&&wx>=1&&wy>=1&&wx<=n&&wy<=m)
33         ans[x][y]=max(ans[x][y],M_S(wx,wy)+1);
34     }
35     return ans[x][y];
36 }
37 int main()
38 {
39     read(n);read(m);
40     for(lli i=1;i<=n;i++)
41         for(lli j=1;j<=m;j++)
42             read(map[i][j]);
43     for(lli i=1;i<=n;i++)
44         for(lli j=1;j<=m;j++)
45             if(!ans[i][j])
46                 M_S(i,j);
47     lli out=-1;
48     for(lli i=1;i<=n;i++)
49         for(lli j=1;j<=m;j++)
50             out=max(out,ans[i][j]);
51     printf("%d",out);
52     return 0;
53 }
原文地址:https://www.cnblogs.com/zwfymqz/p/7107036.html