• POJ1088滑雪


    马上省赛了,还是刷水题的弱菜。。。

    六级 + 省赛 + windows sdk + 数据结构(细+深度) + 操作系统(实现内存管理和文件操作等) 。。。

    算了算,累死也很难完成了。

    --------------------------------------------------------------------------------------------------------------------

    滑雪这个题很早之前就做了。现在感觉现在的状态真的很适合学习了,所以重新开始学习,数据结构 + 动态规划+ 搜索。

    总结可以解决问题的几个方法:

    1、递归(很显然会超时)

    3、记忆化搜索(有点动态规划的味道,最主要的就是记忆化,就是用一个数组标记是否被访问过)

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

    状态转移方程:

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

    所以代码也是很容易实现了

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define MAX 105
    int r, h;
    int maps[MAX][MAX];
    int dp[MAX][MAX];
    const int moves[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
    
    int DFS(int x, int y)
    {
    	int sum = 0;
    	if(dp[x][y] >= 0)
    	{
    		return dp[x][y];
    	}
    	else
    	{
    		for(int i = 0; i < 4; i++)
    		{
    			int p = x + moves[i][0];
    			int q = y + moves[i][1];
    			if(p >= 1 && p <= r && q >= 1 && q <= h && maps[p][q] < maps[x][y])
    			{
    				 sum = max(sum,DFS(p,q));
    			}
    		}
    		return dp[x][y] = sum + 1;
    	}
    }
    int main()
    {
    	freopen("in.txt","r",stdin);
    	cin >> r >> h;
    	for(int i = 1; i <= r; i++)
    	{
    		for(int j = 1; j <= h; j++)
    		{
    			cin >> maps[i][j];
    		}
    	}
    	memset(dp, -1, sizeof(dp));
    	int result = -1;
    	for(int i = 1; i <= r; i++)
    	{
    		for(int j = 1; j <= h; j++)
    		{
    			result = max(result,DFS(i,j));
    		}
    	}
    	cout << result << endl;
    
    	return 0;
    }
    


  • 相关阅读:
    代码之密
    java 流
    JAVA 汇编语言查看
    JIT
    javap生成的字节码
    微信APP
    微信小程序
    PERL IDE
    android-studio 下载
    Windows Driver Foundation-User-Mode Driver Framework 服务不能启动(错误31)问题解决
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835166.html
Copyright © 2020-2023  润新知