滑雪

時限: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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章