这份代码怎么添加记忆化才能正确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;
}