滑雪

滑雪

Description

小明喜欢滑雪,因为滑雪的确很刺激,可是为了获得速度,滑的区域必须向下倾斜,当小明滑到坡底,不得不再次走上坡或等着直升机来载他,小明想知道在一个区域中最长的滑坡。滑坡的长度由滑过点的个数来计算,区域由一个二维数组给出,数组的每个数字代表点的高度。下面是一个例子:
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-24-17-16-1(从25开始到1结束),当然25-24……2…1更长,事实上这是最长的一条。

Input

第一行为表示区域的二维数组的行数R和列数C(1≤R、C≤100)下面是R行,每行有C个数代表高度。

Output

输出区域中最长的滑坡长度。

Sample Input

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

Sample Output

25

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAX_R=1e2+5;
const int MAX_C=1e2+5;
struct v{
	int x,y,z;
}d[MAX_R*MAX_C];
int dp[MAX_R][MAX_C];
int a[MAX_R][MAX_C];
int R,C;
int b[4]={-1,1,0,0};
int c[4]={0,0,-1,1}; 
int cmp(v m,v n){
	return m.z<n.z;
}
int main(){	
	int dx,dy,tx,ty,k,t,ans;
	while(scanf("%d%d",&R,&C)!=EOF){
		k=ans=0;
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=R;i++)
			for(int j=1;j<=C;j++){
				scanf("%d",&a[i][j]);
				dp[i][j]=1;
				d[k].x=i; d[k].y=j; d[k++].z=a[i][j];		
			}
		//排序	
		sort(d,d+k,cmp);
		//递推 
		for(int i=0;i<k;i++){
			dx=d[i].x; dy=d[i].y; t=0;
			for(int j=0;j<4;j++){
				tx=dx+b[j]; ty=dy+c[j];
				if(a[dx][dy]>a[tx][ty]&&tx>=1&&tx<=R&&ty>=1&&ty<=C)
					t=max(t,dp[tx][ty]);
			}
			dp[dx][dy]=++t;
			ans=max(ans,dp[dx][dy]);
		}
		printf("%d\n",ans);			
	}								
	return 0;
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页