acwing.901.滑雪问题.记忆化搜索

*题目

给定一个 R� 行 C� 列的矩阵,表示一个矩形网格滑雪场。

矩阵中第 i� 行第 j� 列的点表示滑雪场的第 i� 行第 j� 列区域的高度。

一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。

当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。

现在给定你一个二维矩阵表示滑雪场各区域的高度,请你找出在该滑雪场中能够完成的最长滑雪轨迹,并输出其长度(可经过最大区域数)。

输入格式

第一行包含两个整数 R� 和 C�。

接下来 R� 行,每行包含 C� 个整数,表示完整的二维矩阵。

输出格式

输出一个整数,表示可完成的最长滑雪长度。

数据范围

1≤R,C≤300,
0≤矩阵中整数≤10000

*代码

#include
#include
#include
using namespace std;

const int N=310;
int f[N][N];//状态表示(集合),从f[i][j]开始滑的路径,不是最大路径,后面会取的
int g[N][N];//存输入的数据
int r,c;
int dp(int i,int j)
{
	int &v=f[i][j];//c++里面的引用,为了简化代码,以后v就代表f[i][j]
	if(v!=-1) return v;//之前计算过(记忆化),就不用再算了,直接返回
	v=1;//一开始为一,若此点走不下去,则这个最大长度就是一,它自己
	//尝试四个方向(状态计算)
	int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};//记住这个走四个方向的数组,记住第一个,第二个是第一个的倒序
	for(int p=0;p<4;p++)
	{
	    int a=dx[p]+i,b=dy[p]+j;//a,b表示走的下一个位置
		if(a>=1&&a<=r&&b>=1&&b<=c&&g[a][b]>r>>c;
	for(int i=1;i<=r;i++)
	{
		for(int j=1;j<=c;j++)
		{
			cin>>g[i][j];
		}
	}
	//因为滑雪者可以从矩阵的任意一点出发,所以遍历
	int res=0;
	memset(f,-1,sizeof(f));//-1表示没走过
	for(int i=1;i<=r;i++)
	{
		for(int j=1;j<=c;j++)
		{//更新,求取最大值
			res=max(res,dp(i,j));
		}
	}
	cout<

你可能感兴趣的:(算法,c++,开发语言)