zstu 2553 滑雪

dfs 就可以了。。
重复的很多要保存。。

#include<stdio.h>
#include<string.h>
int map[105][105];
int way[105][105];
int n,m;
int max(int g,int h)
{
    return g>h?g:h;
}
int dfs(int x,int y,int high)
{
    if(x<1||x>n||y<1||y>m||map[x][y]>=high)
        return 0;
    if(way[x][y]>=0)
        return way[x][y];
    int step=max(max(dfs(x-1,y,map[x][y]),dfs(x+1,y,map[x][y])),max(dfs(x,y-1,map[x][y]),dfs(x,y+1,map[x][y])))+1;
    way[x][y]=step;
    return step;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int ans=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&map[i][j]);
        memset(way,-1,sizeof(way));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                int test=dfs(i,j,0x3f3f3f3f);
                ans=max(ans,test);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(dp,DFS)