这一题相当于两个人从左上角走到右上角
dp[i][j][k][l]表示第一个人走到(i,j)第二个人走到(k,l)时取到数总和的最大值
dp[i][j][k][l]=max(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1])+a[i][j]+a[k][l]
如果i==k,j==l时应该再减去a[i][j](每个位置的数只能取一次)
#include<iostream> using namespace std; int dp[11][11][11][11];//dp[i][j][k][l]表示第一个人走到(i,j)第二个人走到(j,k)时取走数的最大值 int n,b,c,d,a[11][11]; int maxx(int a,int b,int c,int d) { a=max(a,b);a=max(a,c);a=max(a,d); return a; } void solve() { int i,j,k,l; cin>>n; while(1) { cin>>b>>c>>d; if(b==0&&c==0&&d==0)break; a[b][c]=d; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=1;k<=n;k++) for(l=1;l<=n;l++) { dp[i][j][k][l]=maxx(dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],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; } int main() { solve(); }