方格取数

题目链接:https://www.luogu.com.cn/problem/P1004

题意:

走两次nxn的方格并取数,求取数的最大值

思路:

四维dp!记f[i,j,x,y]为第一次走到i,j,第二次走到x,y的能获得的和的最大值
不难发现由四种状态转移过来
当i,j,x,y位置相等时,只能加一遍格子上的数

int f[10][10][10][10];
void solve(){
	int n;cin>>n;
	vector<vector<int>>g(n+5,vector<int>(n+5,0));
	int a,b,c;
	while(cin>>a>>b>>c){
		if(a==b&&b==c&&c==0)break;
		g[a][b]=c;
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int x=1;x<=n;x++){
				for(int y=1;y<=n;y++){
					f[i][j][x][y]=max(f[i-1][j][x-1][y],max(f[i][j-1][x-1][y],max(f[i-1][j][x][y-1],f[i][j-1][x][y-1])))+g[i][j]+g[x][y];
					if(i==x&&j==y)f[i][j][x][y]-=g[i][j];
				}
			}
		}
	}
	cout<<f[n][n][n][n]<<endl;
}
posted @ 2025-04-01 19:39  Marinaco  阅读(19)  评论(0)    收藏  举报
//雪花飘落效果