POJ 1088 滑雪

POJ 1088 滑雪


算法解析:可以利用递归然后记录已计算出最长距离的点(便于后续的调用),其实是利用动态规划思想,最长距离=max(该点到其他可到达点距离+其他可到达点最长距离)。


算法参照了http://poj.org/showmessage?message_id=113914


算法代码注意事项:这次居然一次就通过了,调试时间也很短,其实理解了动态规划思想本身编程不是特别麻烦。


#include<iostream>
//#include <fstream>
using namespace std;

//初始化
int row,col;
int m[100][100];
int l[100][100];

//返回坐标为i,j时的最大距离
int Dfs(int i, int j)
{
	if (l[i][j]!=0)
	{
		return l[i][j];
	}

	int max=0;

	//左边点
	if (i>0)
	{
		if (m[i-1][j]<m[i][j])
		{
			if (max<Dfs(i-1,j))
			{
				max=Dfs(i-1,j);
			}
		}
	}
	//上边点
	if (j>0)
	{
		if (m[i][j-1]<m[i][j])
		{
			if (max<Dfs(i,j-1))
			{
				max=Dfs(i,j-1);
			}
		}
	}
	//右边点
	if (i<row-1)
	{
		if (m[i+1][j]<m[i][j])
		{
			if (max<Dfs(i+1,j))
			{
				max=Dfs(i+1,j);
			}
		}
	}
	//下边点
	if (j<col-1)
	{
		if (m[i][j+1]<m[i][j])
		{

			if (max<Dfs(i,j+1))
			{
				max=Dfs(i,j+1);
			}
		}
	}

	return l[i][j]=max+1;



}

int main()
{

//	ifstream infile("test.txt");
//	ofstream outfile("result.txt");

	//输入
	cin>>row>>col;
//	infile>>row>>col;

	for (int i=0; i!=row; i++)
	{
		for (int j=0; j!=col; j++)
		{
			cin>>m[i][j];
//			infile>>m[i][j];
			l[i][j]=0;
		}
	}

	//求取矩阵所有点的最大距离
	for (int i=0; i!=row; i++)
	{
		for (int j=0; j!=col; j++)
		{
			l[i][j]=Dfs(i,j);
		}
	}

	//求取所有点中最大的距离值
	int max=0;
	for (int i=0; i!=row; i++)
	{
		for (int j=0; j!=col; j++)
		{
			if (max<l[i][j])
			{
				max=l[i][j];
			}
		}
	}
	
	//输出
	cout<<max<<endl;
//	outfile<<max<<endl;

//	infile.close();
//	outfile.close();
}

其他:还有一种 不使用递归的动态规划算法,该算法先将高度进行排序,从最低点开始处理,避免了边界问题(因为边界高度为0必然小于最低点,而我们是由从低向高进行处理,因而边界点绝对不符合条件),具体的分析和代码可以参考上面给出的链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值