四维动规 洛谷P1004方格取数

时间:2022-11-25 12:16:52

分析:这个题因为数据量非常小,可以直接用四维的DP数组

dp[i][j][k][l]表示第一个人走到位置(i,j),第二个人走到位置[k][l]时所取的数的最大和

状态转移方程可以轻松得出为:dp[i][j][k][l]=max(dp[i-1][j][k-1][l],max(dp[i-1][j][k][l-1],max(dp[i][j-1][k-1][l],dp[i][j-1][k][l-1])))+a[i][j]+a[k][l]

注意,当两个人走到同一个位置时,因为数取走后就没了,是需要减去同时走过的位置(这一点是本题的重点,在dp状态转移的过程中,会把所有两个人走的重复的点都遍历出来,所以在最后最大的结果里,只要有过两个人都走过的位置,就会减去一次重复位置处的数值)

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double pi=acos(-);
const int inf=<<;
int a[][];
int dp[][][][];
int main(){
int n;scanf("%d",&n);
int x,y,z;
while(scanf("%d%d%d",&x,&y,&z)){
if(!x&&!y&&!z) break;
a[x][y]=z;
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
for(int k=;k<=n;k++){
for(int l=;l<=n;l++){
dp[i][j][k][l]=max(dp[i-][j][k-][l],max(dp[i-][j][k][l-],max(dp[i][j-][k-][l],dp[i][j-][k][l-])))+a[i][j]+a[k][l];
if(i==k&&j==l) dp[i][j][k][l]-=a[i][j];
}
}
}
}
cout<<dp[n][n][n][n]<<endl;
return ;
}