zoukankan      html  css  js  c++  java
  • 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基础教程(20)--数字和字符串
    Java基础教程(19)--Object类
    python 选择和循环结构
    购物清单
    第五次安卓作业(计算器和增删改查)
    第四次安卓作业(用户添加)
    第三次安卓作业(用户登录)
    第二次安卓作业(九宫格)
    5.22作业
    5.29作业
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835166.html
Copyright © 2011-2022 走看看