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;
}


原文地址:https://www.cnblogs.com/lgh1992314/p/5835166.html