滑雪

poj 1088

题目大意:

解决:记忆化搜索 dfs

#include <iostream>

using namespace std;

#define  D "%d" 

#define _S scanf 

const int N=105;

int map[105][105];

int dp[105][105];

bool vis[105][105];

int m,n;

int dx[]={1,-1,0,0};

int dy[]={0,0,-1,1};

int dfs(int x,int y)

{

    if(dp[x][y] > 0)return dp[x][y];

    for(int i=0;i<4;i++)

    {

        int nx=x+dx[i];

        int ny=y+dy[i];

        if(nx>=0 && nx <m && ny>=0 && ny <n )

        if(!vis[nx][ny] && map[nx][ny] < map[x][y])

        {

            vis[nx][ny]=1;

            dp[x][y]=max(1+dfs(nx,ny),dp[x][y]);

            vis[nx][ny]=0;

        }

    }

    return dp[x][y];

}

int main()

{

    _S(D D,&m,&n);

    int i,j;

    for(i = 0; i < m; i++ )

       for( j = 0; j < n; j++ )

       _S(D,&map[i][j]);

       

    int Max=0;

    for(i = 0; i < m; i++)

       for(j = 0; j < n; j++)

       {

            memset(vis,0,sizeof(vis));

            vis[i][j]=1;

            dfs(i,j);

            if(dp[i][j] > Max)Max=dp[i][j];

       }

       

     printf(D "\n",Max+1);   

       

    system("pause");

    return 0;

}

 

 

你可能感兴趣的:(滑雪)