深搜为啥wa了4个
查看原帖
深搜为啥wa了4个
693797
czp33333楼主2023/4/13 21:13

深搜,把两张纸条都看做从左上角开始,每次都有四种情况如果两个纸条下一步走的点重合,就不走,另外三种情况能遍历到所有情况 代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int n1,m1;
int M;
int f[51][51][51][51],s[51][51];
int dfs(int x1,int y1,int x2,int y2)
{
	if(f[x1][y1][x2][y2]!=-1) return f[x1][y1][x2][y2];
	if (x1==n1&&y1==m1&&x2==n1&&y2==m1) return 0;
	int M=0;
	//都向下走
	if(x1<n1&&x2<m1&&(x1+1!=x2+1||y1!=y2) )
	{
		M=max(M,dfs(x1+1,y1,x2+1,y2)+s[x1+1][y1]+s[x2+1][y2]);
	}
	//A向下走,B向右走
	if(x1<n1&&y2<m1&&(x1+1!=x2||y1!=y2+1)) 
	{
		M=max(M,dfs(x1+1,y1,x2,y2+1)+s[x1+1][y1]+s[x2][y2+1]);
	}
	//A向右走,b向下走
	if(y1<n1&&x2<m1&&(x1!=x2+1||y1+1!=y2)) M=max(M,dfs(x1,y1+1,x2+1,y2)+s[x1][y1+1]+s[x2+1][y2]);
	//A向右走,b向右走
	if(y1<n1&&y2<m1&&(x1!=x2||y1+1!=y2+1)) M=max(M,dfs(x1,y1+1,x2,y2+1)+s[x1][y1+1]+s[x2][y2+1]);
	f[x1][y1][x2][y2]=M;
	//cout<<f[x1][y1][x2][y2]<<endl;
	return M;
}
int main()
{
	cin>>n1>>m1;
	for(int i=0;i<=n1;i++)
	{
		for(int j=0;j<=m1;j++)
		{
			for(int k=0;k<=n1;k++)
			{
				for(int m=0;m<=m1;m++)
				{
					f[i][j][k][m]=-1;
				}
			}
		}
	}
	int a;
	for(int i=1;i<=n1;i++)
		for(int j=1;j<=m1;j++)
		{
			cin>>a;
			s[i][j]=a;
		}
	cout<<dfs(1,1,1,1)+s[1][1];
	return 0;
}
2023/4/13 21:13
加载中...