传纸条 记忆化dfs求助,
查看原帖
传纸条 记忆化dfs求助,
423270
l17663843890楼主2021/4/16 20:49

求助大佬

这份代码怎么添加记忆化才能正确ac 传纸条 传送门;


#include <iostream>
using namespace std
int n,m,mp[1000][1000];
int xx[2]={1,0};/* 右上到左下的走法  只能走下和右 */
int yy[2]={0,1}; 
int xxx[2]={-1,0};/* 左下到右上的走法  只能走上和左 */
int yyy[2]={0,-1};
int vis[1000][1000];//标记数组 
int ans=0; //最终结果 
bool check(int x,int y) 
{
	if(x>=1&&x<=n&&y>=1&&y<=m&&!vis[x][y])
	return true;
	return false;
}
void dfs(int x,int y,int n,int m,int sum)
{	

	ans=max(ans,sum);   //存储最大结果 
	for(int i=0;i<2;i++) //左上到右下 
	{
		int dx=x+xx[i];
		int dy=y+yy[i];
		if(check(dx,dy)) //判断是否越界和是否走过该点 
		{
			vis[dx][dy]=1; //标记走过 
			dfs(dx,dy,n,m,sum+mp[dx][dy]);
		
			vis[dx][dy]=0; //回溯取消标记 
		}	
	}
			for(int j=0;j<2;j++) //右下 到左上 
				{	
					int dxx=n+xxx[j];
					int dyy=m+yyy[j];
					if(check(dxx,dyy)) //判断是否越界和是否走过该点 
					{	
						
						vis[dxx][dyy]=1;  
						dfs(x,y,dxx,dyy,sum+mp[dxx][dyy]);
						vis[dxx][dyy]=0;
					} 
				}
			
		 
	
	
 } 
main()
{
	cin>>m>>n;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	cin>>mp[i][j];
	
	dfs(1,1,n,m,0);
	cout<<ans;
	
}

2021/4/16 20:49
加载中...