求助样例1不过2过
查看原帖
求助样例1不过2过
124386
极点JiDian楼主2021/10/1 09:39

记忆化递归

#include<bits/stdc++.h>
using namespace std;
const int maxn=2500;
int a[maxn][maxn];
int n,m;
int v[maxn][maxn];
int num1[maxn][maxn][3];
int mon=-2000000;
void num(int x,int y,int money){
	money+=a[x][y];
	//cout<<money<<endl;
//	cout<<x<<' '<<y<<endl;
	if(x==n&&y==m){
		cout<<money<<endl;
		mon=max(mon,money);
		return ;
	}
	const int dx[]={0,1,0};
	const int dy[]={1,0,-1};
	for(int i=0;i<3;i++){
	//	cout<<(x+dx[i]<=n)<<endl;
		if(!v[x+dx[i]][y+dy[i]]&&x+dx[i]<=n&&y+dy[i]<=m&&x+dx[i]>=1&&y+dy[i]>=1){
			if(num1[x+dx[i]][y+dy[i]][money]!=0){
				mon=max(mon,num1[x+dx[i]][y+dy[i]][money]);
				continue;
			}
			v[x+dx[i]][y+dy[i]]=1;
			num(x+dx[i],y+dy[i],money);
			num1[x+dx[i]][y+dy[i]][money]=mon;
			v[x+dx[i]][y+dy[i]]=0;
		}
	} 
}
int main(){
	memset(v,0,sizeof(v));
	memset(num1,0,sizeof(num1));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	v[1][1]=1;
	num(1,1,0);
	cout<<mon<<endl;
	return 0;
}
2021/10/1 09:39
加载中...