VIJOS-P1011 清帝之惑之顺治 dfs

[ Submit][ Status][ Web Board]

Description

        顺治喜欢滑雪,这并不奇怪,  因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待太监们来载你。顺治想知道载一个区域中最长的滑坡。         区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子:

          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  < =  500)。下面是R行,每行有C个整数,代表高度h,0< =h< =10000。

Output

        输出最长区域的长度。

Sample Input

5 51 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9

Sample Output

25

Source

VIJOS




#include
int n,m,a[501][501],dp[501][501],ans,dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
bool k[501][501];
int max(int x,int y)
{
    if(x>y)
        return x;
    return y;   
}
int dfs(int x,int y)
{
    if(k[x][y]) 
        return dp[x][y];
    k[x][y]=1;
    int flag=0;
    for(int i=0;i<4;i++)
    {
        int nx=x+dx[i],ny=y+dy[i];
        if(nx<1||nx>n||ny<1||ny>m||a[nx][ny]>=a[x][y]) 
            continue;
        flag=1;
        dp[x][y]=max(dp[x][y],dfs(nx,ny)+1);
    }
    if(flag==0) 
        dp[x][y]=1;
    ans=max(ans,dp[x][y]);
    return dp[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",&a[i][j]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            dfs(i,j);
    printf("%d",ans);
}

你可能感兴趣的:(dfs)