P1004 方格取数
四维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][j-1][k-1][l],max(dp[i-1][j][k][l-1],dp[i][j-1][k][l-1])))+M[i][j]+M[k][l];
当i==k&&j==l是,要把多加的那个M[i][j]删掉
做法好神奇
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 int dp[11][11][11][11]; 6 7 int M[11][11]; 8 int main() 9 { 10 int n;cin>>n; 11 while(1) 12 { 13 int a,b,c;cin>>a>>b>>c; 14 if(a==0&&b==0&&c==0) break; 15 M[a][b]=c; 16 } 17 for(int i=1;i<=n;i++) 18 for(int j=1;j<=n;j++) 19 for(int k=1;k<=n;k++) 20 for(int l=1;l<=n;l++) 21 { 22 dp[i][j][k][l]=max(dp[i-1][j][k-1][l],max(dp[i][j-1][k-1][l],max(dp[i-1][j][k][l-1],dp[i][j-1][k][l-1])))+M[i][j]+M[k][l]; 23 if(i==k&&j==l) dp[i][j][k][l]-=M[i][j]; 24 } 25 cout << dp[n][n][n][n]<<endl; 26 27 28 29 return 0; 30 }