skiing
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
5
-
描述
-
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。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
-
输入
-
第一行表示有几组测试数据,输入的第二行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
后面是下一组数据;
输出
- 输出最长区域的长度。 样例输入
-
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
样例输出
-
25
-
第一行表示有几组测试数据,输入的第二行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
//思路:从每个点出发,深搜加动规,将最长距离保存下来。需考虑所有点高度相同的情况
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int maxn;
int a[101][101],dp[101][101];
int dfs(int x,int y,int r,int c)
{
if(a[x][y]>a[x-1][y] && dp[x][y]+1>dp[x-1][y] && x-1>=0)
{
dp[x-1][y]=dp[x][y]+1;
if(maxn<dp[x-1][y]) maxn=dp[x-1][y];
dfs(x-1,y,r,c);
}
if(a[x][y]>a[x+1][y] && dp[x][y]+1>dp[x+1][y] && x+1<r)
{
dp[x+1][y]=dp[x][y]+1;
if(maxn<dp[x+1][y]) maxn=dp[x+1][y];
dfs(x+1,y,r,c);
}
if(a[x][y]>a[x][y-1] && dp[x][y]+1>dp[x][y-1] && y-1>=0)
{
dp[x][y-1]=dp[x][y]+1;
if(maxn<dp[x][y-1]) maxn=dp[x][y-1];
dfs(x,y-1,r,c);
}
if(a[x][y]>a[x][y+1] && dp[x][y]+1>dp[x][y+1] && y+1<c)
{
dp[x][y+1]=dp[x][y]+1;
if(maxn<dp[x][y+1]) maxn=dp[x][y+1];
dfs(x,y+1,r,c);
}
}
int main()
{
int n,r,c,i,j,p,q;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&r,&c);
for(i=0;i<r;i++)
for(j=0;j<c;j++)
scanf("%d",&a[i][j]);
maxn=1;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
{
memset(dp,0,sizeof(dp));
dp[i][j]=1;
dfs(i,j,r,c);
}
printf("%d\n",maxn);
}
}
//记忆化搜索
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[102][102];
int dp[102][102];
int wsad[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int r,c;
int ms(int a,int b)
{
if(a<1 || b<1 || a>r || b>c) return 0;
if(dp[a][b]) return dp[a][b];
for(int i=0;i<4;i++)
{
if(map[a][b]>map[a+wsad[i][0]][b+wsad[i][1]])
if(ms(a+wsad[i][0],b+wsad[i][1])>dp[a][b])
dp[a][b]=ms(a+wsad[i][0],b+wsad[i][1]);
}
return ++dp[a][b];
}
int main()
{
//freopen("1.txt","r",stdin);
int n,i,j,max;
scanf("%d",&n);
while(n--)
{
max=0;
scanf("%d%d",&r,&c);
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
scanf("%d",&map[i][j]);
memset(dp,0,sizeof(dp));
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
{
int t=ms(i,j);
if(t>max) max=t;
}
printf("%d\n",max);
}
}