zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    c++ 学习笔记
    python 2048游戏控制器
    c++ 动态内存
    c++ 拷贝构造函数、拷贝运算符、析构函数
    c++ struct enum union加typedef与不加typedef
    c++ 动态内存2
    c++ 指针数组与指向数组的指针
    c++ TextQuery程序
    c++ virtual
    c++ 动态内存 动态数组
  • 原文地址:https://www.cnblogs.com/Houheshuai/p/3696401.html
Copyright © 2011-2022 走看看