WA#2记忆化求调
查看原帖
WA#2记忆化求调
1200603
define楼主2024/10/3 17:54
#include<bits/stdc++.h>

using namespace std;
int n;
int ma[11][11];
int dp[11][11][11][11];
int u,v,w;
int dx[5]={0,1,0};
int dy[5]={0,0,1};
int dfs(int x,int y,int p,int q){
	if(x+y==2*n){
		return ma[n][n];
	}
	int m=0;
	if(dp[x][y][p][q]!=-1) return dp[x][y][p][q];
	if(x==p&&y==q){
		if(x==n){
		if(p==n) m=max(m,dfs(x,y+1,p,q+1)+ma[x][y]);
		if(q==n) m=max(m,dfs(x,y+1,p+1,q)+ma[x][y]);
	}
	else if(y==n){
		if(p==n) m=max(m,dfs(x+1,y,p,q+1)+ma[x][y]);
		if(q==n) m=max(m,dfs(x+1,y,p+1,q)+ma[x][y]);
	}
	else{
		m=max(m,dfs(x,y+1,p,q+1)+ma[x][y]);
		m=max(m,dfs(x,y+1,p+1,q)+ma[x][y]);
		m=max(m,dfs(x+1,y,p,q+1)+ma[x][y]);
		m=max(m,dfs(x+1,y,p+1,q)+ma[x][y]);
	}
	}
	else{
		if(x==n){
		if(p==n) m=max(m,dfs(x,y+1,p,q+1)+ma[x][y]+ma[p][q]);
		if(q==n) m=max(m,dfs(x,y+1,p+1,q)+ma[x][y]+ma[p][q]);
	}
	else if(y==n){
		if(p==n) m=max(m,dfs(x+1,y,p,q+1)+ma[x][y]+ma[p][q]);
		if(q==n) m=max(m,dfs(x+1,y,p+1,q)+ma[x][y]+ma[p][q]);
	}
	else{
		m=max(m,dfs(x,y+1,p,q+1)+ma[x][y]+ma[p][q]);
		m=max(m,dfs(x,y+1,p+1,q)+ma[x][y]+ma[p][q]);
		m=max(m,dfs(x+1,y,p,q+1)+ma[x][y]+ma[p][q]);
		m=max(m,dfs(x+1,y,p+1,q)+ma[x][y]+ma[p][q]);
	}
	}
	
	return dp[x][y][p][q]=m;
}
int main()
{
	cin>>n;
	memset(dp,-1,sizeof dp);
	while(1){
		cin>>u>>v>>w;
		if(u==0&&v==0&&w==0) break;
		ma[u][v]=w;
	}
	cout<<dfs(1,1,1,1);
	return 0;
}

ma为方阵,xypq分别是第一次和第二次的坐标

2024/10/3 17:54
加载中...