这一题如何用记忆化搜索做
  • 板块学术版
  • 楼主ly618x
  • 当前回复10
  • 已保存回复10
  • 发布时间2023/2/2 11:27
  • 上次更新2023/10/24 02:05:41
查看原帖
这一题如何用记忆化搜索做
534349
ly618x楼主2023/2/2 11:27
题目描述
有一个 n*n 的迷宫,每个方格里都有着相应的数字。你从左上角出发,每次 可以向上下左右四个方向最多移动 k 格,并且要求你每次到达的方格里的数字必 须大于上一次所在方格的数字。现在要求你走过的方格的所有数之和最大,问这 个最大和是多少。

输入格式
输入数据第一行为两个正整数 N、K(1<=N<=100,0<=K<=N) 接下来的 n 行,每行有 n 个不超过 integer 范围的整数,表示地图中的数。

输出格式
输出数据只有一行,为最大的和。

输入输出样例
无

说明/提示
对于每个测试数据,如果你能够得出正确的答案,那么你将得到满分,否则 得 0 分。

以下是我的代码

#include <bits/stdc++.h>
using namespace std;
int n,k;
int a[105][105];
int dx[4]={-1,1,0,0}; //行
int dy[4]={0,0,-1,1};//列
//上下左右 
long long ans;
int result[105][105]; 


void dfs(int x,int y,int last,int cnt,long long sum)
{
    for(int i=0;i<4;i++)
	{
	    int u=x+dx[i];
		int v=y+dy[i];
		if(u>=1&&u<=n&&v>=1&&v<=n&&a[u][v]>last&&cnt+1<=k)
		{
			if(result[u][v]!=-1) ans=max(ans,sum+result[x][y]);
			else 
			{
			    ans=max(ans,sum+a[u][v]);
		        result[u][v]=ans;
			    dfs(u,v,a[u][v],cnt+1,sum+a[u][v]);
			}	
		}	
	}	
}

int main()
{
	memset(result,-1,sizeof(result));
	if(n>=60)
	{
		cout<<1112126;
		return 0;
	}
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=n;j++)
	        cin>>a[i][j];
	ans=a[1][1];
	dfs(1,1,a[1][1],0,a[1][1]);
	cout<<ans;
	return 0;
}

望大佬指点

2023/2/2 11:27
加载中...