時限:1000ms 內存限制:10000K 總時限:3000ms
描述:
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。
輸出:
輸出最長區域的長度。
輸入樣例:
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<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int maze[105][105];
int dp[105][105];
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
int Max(int a ,int b)
{
return a>b? a:b;
}
int DFS(int i,int j)
{
int t,MAX=0,temp=0;
temp=maze[i][j];
if(dp[i][j]!=0)
return dp[i][j];
if(temp<=maze[i][j+1] && temp<=maze[i][j-1] && temp<=maze[i+1][j] && temp<=maze[i-1][j])
return 1;
for(t=0;t<4;t++)
{
if(maze[i+dir[t][0]][j+dir[t][1]]<maze[i][j])
MAX=Max(DFS(i+dir[t][0],j+dir[t][1])+1,MAX);
}
return MAX;
}
int main()
{
memset(maze,1,sizeof(maze));
memset(dp,0,sizeof(dp));
int m,n,i,j,sum=0;
cin >> m >> n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
cin >> maze[i][j];
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
dp[i][j] = Max(DFS(i,j),dp[i][j]);
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
sum=Max(dp[i][j],sum);
cout << sum << endl;
return 0;
}