P1004 方格取数(四维dp)
经典dp问题,dp[i][j][k][l],i、j代表第一个人的位置,k、l代表第二个人的位置,则列出dp方程,dp[i][j][k][l]=max(dp[i-1][j][k][l-1],dp[i-1][j][k-1][l],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1]);
特判一下两个人在同一个位置只能取一个数字。
#include<bits/stdc++.h> using namespace std; const int maxn=12; int dp[maxn][maxn][maxn][maxn]; int a[maxn][maxn]; int n,v1,v2,v3; int main() { cin>>n>>v1>>v2>>v3; while(v1!=0&&v2!=0&&v3!=0){ a[v1][v2]=v3; cin>>v1>>v2>>v3; } 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(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]; if(i==k&&j==l)dp[i][j][k][l]-=a[i][j]; } } } } cout<<dp[n][n][n][n]<<endl; return 0; }