【動態規劃】 POJ1088 滑雪問題
阿新 • • 發佈:2019-02-15
Description
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更長。事實上,這是最長的一條。 Input 輸入的第一行表示區域的行數R和列數C(1 <= R,C <= 100)。下面是R行,每行有C個整數,代表高度h,0<=h<=10000。 Output 輸出最長區域的長度。 **Sample Input** 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 **Sample Output** 25
#include <iostream>
using namespace std;
int R,C;
int ori[110][110];
int result[110][110]; //從i j出發的最長路徑
int maxLength;
int s(int i,int j) // 從i / j 出發的最長路徑
{
if( result[i][j] != -1)
return result[i][j];
int a = 0;
int b = 0;
int c = 0;
int d = 0;
if(ori[i][j] > ori[i-1 ][j] && ori[i-1][j] != -1)
a = s(i-1,j);
if(ori[i][j] > ori[i+1][j] && ori[i+1][j] != -1)
b = s(i+1,j);
if(ori[i][j] > ori[i][j-1] && ori[i][j-1] != -1)
c = s(i,j-1);
if(ori[i][j] > ori[i][j+1] && ori[i][j+1] != -1)
d = s(i,j+1 );
int max1 = a > b? a : b;
int max2 = c > d? c : d;
int max3 = max1 > max2? max1 : max2;
if( max3 == 0 ) //表示 i j 已經是最矮的點
result[i][j] = 1;
else result[i][j] = max3 + 1;
return result[i][j];
}
int main()
{
for(int i = 0; i < 110; ++i)
for(int j = 0; j < 110; ++j)
{
ori[i][j] = -1;
result[i][j] = -1;
}
cin >> R >> C;
for(int i = 1; i <= R; ++i)
for(int j = 1;j <= C; ++j)
cin >> ori[i][j];
for(int i = 1; i <= R; ++i)
for(int j = 1; j <= C; ++j)
{
int maxLenght = s(i,j);
if(result[i][j] > maxLength)
maxLength = result[i][j];
}
cout << maxLength;
return 0;
}