洛谷1434 滑雪

洛谷1434 滑雪

本題地址: http://www.luogu.org/problem/show?pid=1434
題目描述
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

看一眼數據範圍,發現用記憶化搜素就能過,搜索一個點時,也順便記下沿途的點的信息,然後……就沒有然後了,輸出最大值就可以了。

#include<cstdio>
#define max(a,b) (((a) > (b)) ? (a) : (b))
using namespace std;
int n,m,map[110][110];
int f[110][110],ans=0;
const int X[4]={-1,0,1,0};
const int Y[4]={0,1,0,-1};
int ss(int x,int y)
{
    if (f[x][y]!=0) return f[x][y];
    for (int i=0;i<=3;++i)
    {
        int ax=x+X[i];
        int ay=y+Y[i];
        if (map[ax][ay]>map[x][y])
            f[x][y]=max(f[x][y],ss(ax,ay)+1);
    }
    return f[x][y];
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;++i)
        for (int j=1;j<=m;++j)
        scanf("%d",&map[i][j]);
    for (int i=1;i<=n;++i)
        for (int j=1;j<=m;++j)
        {
            f[i][j]=ss(i,j);
            if (f[i][j]>ans) ans=f[i][j];
        }
    printf("%d",ans+1);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章