P1434 [SHOI2002]滑雪 (dfs+剪枝)

liuliu2333發表於2018-04-30

題目描述

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個空格間隔)。

輸出格式:

輸出區域中最長滑坡的長度。

輸入輸出樣例

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<bits/stdc++.h> 
using namespace std;
int a[106][106],b[106][106],c[106][106];
int d[4][2]={0,1,1,0,-1,0,0,-1};
int maxn;	int n,m;
int dfs(int x,int y)
{
    if(c[x][y])
    return c[x][y];
    c[x][y]=1;
    for(int i=0;i<4;i++)
    {
        int dx=x+d[i][0],dy=y+d[i][1];
        if(dx<0||dy<0||dx>=n||dy>=m||a[dx][dy]>=a[x][y])
        continue;
        else
        c[x][y]=max(c[x][y],dfs(dx,dy)+1);
    }
    return c[x][y];
}
int main()
{

    
    memset(c,0,sizeof(c));
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    int ans=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            ans=max(ans,dfs(i,j));
         } 
    }
    printf("%d\n",ans);
    return 0;
}

相關文章