测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40960. 滑雪

填空题 较难

题目描述

滑雪

题目描述

迈克尔坡喜欢发现这并不重要,因为看到坡确实很刺激。为了获得,你必须加快滑行的区域,而当你滑到底部时,你又是再次上等待下台走来装载。迈克尔想知道一个区域中长度的滑动。区域由一个范围内的滑坡提供。这里的每个数字代表点的高度。下面是一个例子

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-23-...-3-1。这是24-2-1的一条。

输入

输入的行数和列数C(1 <R= R,C <= 00)。下面是行,每行有C个,代表第一个高度h,代表区域h,0=h<=10000 。

输出

区域输出的长度。

样例输入

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

参考答案

#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; int r,c,a[150][150],len[150][150]; int xr[]={0,1,0,-1}; int yr[]={-1,0,1,0}; int dfs(int x,int y) { if(len[x][y]!=-1)return len[x][y]; int sum=1; for(int i=0;i<4;i++){ int xx=x+xr[i]; int yy=y+yr[i]; if(xx>0 && xx<=r && yy>0 && yy<=c ) if(a[xx][yy]>a[x][y]) sum=max(sum,dfs(xx,yy)+1); } len[x][y]=sum; return len[x][y]=sum; } int main() { //freopen("in.txt","r",stdin); while(scanf("%d%d",&r,&c)!=EOF){ memset(a,-1,sizeof(a)); for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) scanf("%d",&a[i][j]); int ret=0; memset(len,-1,sizeof(len)); for(int i=1;i<=r;i++) for(int j=1;j<=c;j++){ ret=max(ret,dfs(i,j)); } printf("%d\n",ret); } return 0; }
上一题 下一题