Poj-1088-滑雪

此题为动态规划加搜索型题目

采用记忆化搜索的方式

dp[i][j]表示从坐标为 i,j 开始滑所能达到的最长距离

则dp[i][j]=max(dp[i-1][j],dp[i][j+1],dp[i+1][j],dp[i][j-1])

代码如下:

#include<stdio.h>
int dir[4][2]= {{0,1},{1,0},{-1,0},{0,-1}};    //初始化偏移量
int dp[105][105];           //dp[x][y]表示从坐标x,y开始滑所达到的最大长度
int map[105][105];
int n,m;
int dfs(int x,int y)
{
    if(dp[x][y])           //若已经搜过,返回
        return dp[x][y];
    int tx,ty,i;
    for(i=0; i<4; i++)     //搜索x,y的上,下,左,右
    {
        tx=x+dir[i][0];
        ty=y+dir[i][1];
        if(tx>= 0 && tx<n && ty>=0 && ty<m && map[tx][ty]<map[x][y]) //未出界且能往tx,ty滑
        {
            int temp=dfs(tx,ty);  //从tx,ty开始滑
            if(temp>=dp[x][y])    //若比从x,y开始滑的距离长或相等
            {
                dp[x][y]=temp+1;
            }
        }
    }
    return dp[x][y];
}
int main()
{
    int i,j,t;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0; i<n; i++)
            for(j=0; j<m; j++)
            {
                scanf("%d",&map[i][j]);
                dp[i][j]=0;
            }
        int max=-1;
        for(i=0; i<n; i++)           //将所有地方遍历一遍,找出最大长度
            for(j=0; j<m; j++)
            {
                t=dfs(i,j);
                if(t>max)
                    max=t;
            }
        //printf("%d
",dp[0][0]);  测试数据dp[0][0]为最低地方
        printf("%d
",max+1);     //最低的地方dp值为0,所以最后加1
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/Houheshuai/p/3696401.html