本次模拟赛T2
  • 板块题目总版
  • 楼主ljcnoi
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/6/30 18:12
  • 上次更新2024/6/30 20:52:18
查看原帖
本次模拟赛T2
1176197
ljcnoi楼主2024/6/30 18:12

T2用记忆化搜索为什么会莫名WA,求教,请问正确算法是什么?

#include<bits/stdc++.h>
using namespace std;
int n,m,fx,fy,le=0;
int fxx[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int t[1005][1005],c[1005][1005];
int maxn(int a,int b)
{
	if(a>b)
	{
		return a;
	}
	else
	{
		return b;
	}
}
void sc()
{
	int cc=-1,cx,cy;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(c[i][j]>cc)
			{
				cc=c[i][j];
				cx=i;cy=j;
			}
		}
	}
	cout<<char(t[cx][cy]);
	while(c[cx][cy]>=2)
	{
		char mq=0;
		for(int k=0;k<=3;k++)
		{
			int xx=cx+fxx[k][0];
			int yy=cy+fxx[k][1];
			if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&c[xx][yy]+1==c[cx][cy]&&t[xx][yy]>mq)
			{
				mq=t[xx][yy];
				cx=xx,cy=yy;
			}
		}	
		cout<<char(t[cx][cy]);
	}
}
int dfs(int x,int y)
{
	if(c[x][y])
	{
		return c[x][y];
	}
	if(t[x][y]==10000000)
	{
		c[x][y]=-10000;
		return 0;
	}
	c[x][y]=1;
	for(int k=0;k<=3;k++)
	{
		int xx=x+fxx[k][0];
		int yy=y+fxx[k][1];
		if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&t[xx][yy]<t[x][y])
		{
			c[x][y]=maxn(c[x][y],dfs(xx,yy)+1);
		}
	}
	return c[x][y];
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		getchar();
		for(int j=1;j<=m;j++)
		{
			char sr;
			sr=getchar();
			if(sr=='#')
			{
				t[i][j]=10000000;
			}
			else
			{
				t[i][j]=int(sr);
			}
			c[i][j]=0;
		}
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			dfs(i,j);
		}
	}
	sc();
	return 0;
}
2024/6/30 18:12
加载中...