洛谷P1434 滑雪

題目描述
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(從24開始,在1結束)。當然25-24-23―┅―3―2―1更長。事實上,這是最長的一條。

輸入輸出格式
輸入格式:
輸入的第一行爲表示區域的二維數組的行數R和列數C(1≤R,C≤100)。下面是R行,每行有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
輸出樣例#1:
25

思路:DP + 遞歸 記憶化搜索加快速度

#include <iostream>
using namespace std;
const int maxn = 101;
int a[maxn][maxn],f[maxn][maxn];
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
int r,c;
int ans = 0;
bool in(int i, int j)
{
    return (i >= 1 && i <= r && j >= 1 && j <= c);
}

int dfs(int i, int j)
{
    for (int k = 0; k < 4; k++)
    {
        int tx = i + dx[k];
        int ty = j + dy[k];
        if (in(tx,ty) && a[tx][ty] < a[i][j])
        {
            if (f[tx][ty] != 1)
                f[i][j] = max(f[tx][ty]+1, f[i][j]);
            else f[i][j] = max(dfs(tx, ty) + 1, f[i][j]);
        }
    }
    return f[i][j];
}
int main()
{
    cin >> r >> c;
    for (int i = 1; i <= r; i++)
        for (int j = 1; j <= c; j++)
        {
            cin >> a[i][j];
            f[i][j] = 1;
        }
    for (int i = 1; i <= r; i++)
        for (int j = 1; j <= c; j++)
        {
            if (dfs(i,j) > ans)
                ans = dfs(i,j);
        }
    cout << ans << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章