您的位置:首页 > 移动开发 > IOS开发

POJ 1088 滑雪 DP

2011-09-10 01:32 489 查看
题意: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更长。事实上,这是最长的一条。
#include < iostream >
using namespace std;

#define N 102
int array

, b

;

int getMax( int i, int j )
{
int temp, max;
temp = max = 0;
if ( b[i][j] != -1 )
return b[i][j];
else
{
if ( array[i][j] > array[i][j+1] )
{
temp = getMax ( i, j+1 );
if ( temp > max )
max = temp;
}
if ( array[i][j] > array[i][j-1] )
{
temp = getMax( i, j-1 );
if ( temp > max )
max = temp;
}
if ( array[i][j] > array[i+1][j] )
{
temp = getMax ( i+1, j );
if ( temp > max )
max = temp;
}
if ( array[i][j] > array[i-1][j] )
{
temp = getMax ( i-1, j );
if ( temp > max )
max = temp;
}
b[i][j] = max + 1;
return b[i][j];
}
}

int main()
{
int i, j;
for ( i = 0; i < N; i++ )
array[i][0] = array[0][i] = array[N-1][i] = array[i][N-1] = 10001;

int r, c;
cin >> r >> c;
for ( i = 1; i <= r; i++ )
{
for ( j = 1; j <= c; j++ )
{
cin >> array[i][j];
b[i][j] = -1;
}
}

int max = 0, temp;
for ( i = 1; i <= r; i ++ )
{
for ( j = 1; j <= c; j++ )
{
temp = getMax(i,j);
if ( temp > max )
max = temp;
}
}
cout << max << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iostream c