【动态规划】P1004 方格取数(四维dp模板题)_ci

与传纸条方法相同!

用f[i][j][k][l]表示第一个人走到(i,j),第二个人走到(k,l)的最优解

我们考虑两个人同时走,就相当于数字三角形

状态转移方程为:

f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l];f[i][j][k][l]=max(f[i−1][j][k−1][l],f[i−1][j][k][l−1],f[i][j−1][k−1][l],f[i][j−1][k][l−1])+a[i][j]+a[k][l];

因为只能取一次,所以当两个人相遇时,只加一次数,否则加两次数(0没有影响)

两人相遇:i==k&&j==l

代码:

#include<iostream>
using namespace std;
int n;
int a,b,c;
int G[100][100];
int dp[100][100][100][100];
void output(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<G[i][j]<<" ";
		}
		cout<<endl;
	}
}
int main(){
	cin>>n;
	cin>>a>>b>>c;
	while(!(a==0&&b==0&&c==0)){
		G[a][b]=c;
		cin>>a>>b>>c;
	} 
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=n;j++){
    		for(int k=1;k<=n;k++){
    			for(int l=1;l<=n;l++){
    				dp[i][j][k][l]=max(max(dp[i-1][j][k-1][l],dp[i][j-1][k-1][l]),max(dp[i-1][j][k][l-1],dp[i][j-1][k][l-1]))+G[i][j]+G[k][l]*(i!=k&&j!=l);
				}
			}
		}
	}
	cout<<dp[n][n][n][n]; 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.