1. 程式人生 > >計蒜客 難題題庫 203 矩形滑雪場

計蒜客 難題題庫 203 矩形滑雪場

trs喜歡滑雪。他來到了一個滑雪場,這個滑雪場是一個矩形,為了簡便,我們用r行c列的矩陣來表示每塊地形。為了得到更快的速度,滑行的路線必須向下傾斜。         例如樣例中的那個矩形,可以從某個點滑向上下左右四個相鄰的點之一。例如24-17-16-1,其實25-24-23…3-2-1更長,事實上這是最長的一條。

輸入格式:

第1行:  兩個數字r,c(1< =r,c< =100),表示矩陣的行列。 第2..r+1行:每行c個數,表示這個矩陣。

輸出格式:

僅一行:  輸出1個整數,表示可以滑行的最大長度。

樣例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

#include<iostream>
#include<vector>
using namespace std;

const int maxn = 100;

int r, c;
int max_len[maxn][maxn], mp[maxn][maxn];

int get_len(int i, int j){
    if(max_len[i][j]){
        return max_len[i][j];
    }
    int max_neighbor = 0;
    if(i - 1 >= 0 && mp[i][j] > mp[i - 1][j]){
        max_neighbor = max(max_neighbor, get_len(i - 1, j));
    }
    if(i + 1 < r && mp[i][j] > mp[i + 1][j]){
        max_neighbor = max(max_neighbor, get_len(i + 1, j));
    }
    if(j - 1 >= 0 && mp[i][j] > mp[i][j - 1]){
        max_neighbor = max(max_neighbor, get_len(i, j - 1));
    }
    if(j + 1 < c && mp[i][j] > mp[i][j + 1]){
        max_neighbor = max(max_neighbor, get_len(i, j + 1));
    }
    max_len[i][j] = max_neighbor + 1;
    return max_len[i][j];
}

int main(){
//	freopen("test.txt", "r", stdin);
    cin >> r >> c;
    int i, j;
    for(i = 0; i < r; ++i){
        for(j = 0; j < c; ++j){
            cin >> mp[i][j];
        }
    }
    int res = 0;
    for(i = 0; i < r; ++i){
        for(j = 0; j < c; ++j){
            res = max(res, get_len(i, j));
        }
    }
	cout << res << endl;
}