首页 > 代码库 > P1732 活蹦乱跳的香穗子

P1732 活蹦乱跳的香穗子

题目描述

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

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

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

那么她最多能跳几次?

输入输出格式

输入格式:

 

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

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

 

输出格式:

 

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

 

输入输出样例

输入样例#1:
2 22 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 }

 

P1732 活蹦乱跳的香穗子