洛谷P1434 滑雪
题目描述
Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子:
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-17-16-1(从24开始,在1结束)。当然25-24-23―┅―3―2―1更长。事实上,这是最长的一条。
输入输出格式
输入格式:
输入的第一行为表示区域的二维数组的行数R和列数C(1≤R,C≤100)。下面是R行,每行有C个数,代表高度(两个数字之间用1个空格间隔)。
输出格式:
输出区域中最长滑坡的长度。
输入输出样例
输入样例#1:
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
输出样例#1:
25
记忆化搜索
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 const int mxn=110; 9 int f[mxn][mxn]; 10 int mp[mxn][mxn]; 11 int n,m; 12 // 13 int mx[5]={0,1,0,-1,0}, 14 my[5]={0,0,1,0,-1}; 15 inline bool check(int x,int y){ 16 if(x<1 || x>n || y<1 || y>n)return 0; 17 return 1; 18 } 19 int dfs(int x,int y){ 20 if(f[x][y])return f[x][y]; 21 int res=0; 22 for(int i=1;i<=4;i++){ 23 int nx=x+mx[i]; 24 int ny=y+my[i]; 25 if(!check(nx,ny))continue; 26 if(mp[nx][ny]>=mp[x][y])continue; 27 res=max(res,dfs(nx,ny)); 28 } 29 f[x][y]=res+1; 30 return res+1; 31 return 1; 32 } 33 // 34 int main(){ 35 scanf("%d%d",&n,&m); 36 int i,j; 37 for(i=1;i<=n;i++) 38 for(j=1;j<=m;j++){ 39 scanf("%d",&mp[i][j]); 40 } 41 int ans=0; 42 for(i=1;i<=n;i++) 43 for(j=1;j<=n;j++){ 44 ans=max(ans,dfs(i,j)); 45 } 46 cout<<ans<<endl; 47 return 0; 48 }
本文为博主原创文章,转载请注明出处。