https://www.51nod.com/tutorial/course.html#!courseId=11&isCurrent=1
解题关键:1、注意i和j的最大取值都是n,k是i与j的和。
2、空间卡的很紧,多一位都不行。
转移方程:$dp[{x_1}][{y_1}][{x_2}][{y_2}] = max{ dp[{x_1}'][{y_1}'][{x_2}'][{y_2}']} + a[{x_1}][{y_1}] + a[{x_2}][{y_2}]$
通过观察,可以消去一个变量,从而
$dp[k + 1][{x_1}][{x_2}] = max{ dp[k][{x_1}'][{x_2}']} + a[{x_1}][{y_1}] + a[{x_2}][{y_2}]$
然后再将相同的处理掉即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int a[402][402]; 5 ll dp[402][201][201]; 6 int m,n; 7 int main(){ 8 memset(dp,0,sizeof dp); 9 scanf("%d%d",&m,&n); 10 for(int i=1;i<=n;i++){ 11 for(int j=1;j<=m;j++){ 12 scanf("%d",&a[i][j]); 13 } 14 } 15 for(int k=2;k<=n+m;k++){ 16 for(int i=1;i<=n&&k-i>=1;i++){ 17 for(int j=1;j<=n&&k-j>=1;j++){ 18 dp[k][i][j]=max(dp[k][i][j],dp[k-1][i-1][j-1]+a[i][k-i]+(i==j?0:a[j][k-j])); 19 dp[k][i][j]=max(dp[k][i][j],dp[k-1][i][j-1]+a[i][k-i]+(i==j?0:a[j][k-j])); 20 dp[k][i][j]=max(dp[k][i][j],dp[k-1][i-1][j]+a[i][k-i]+(i==j?0:a[j][k-j])); 21 dp[k][i][j]=max(dp[k][i][j],dp[k-1][i][j]+a[i][k-i]+(i==j?0:a[j][k-j])); //可以以一个4元最大值函数结束。 22 } 23 } 24 } 25 printf("%lld ",dp[n+m][n][n]); 26 return 0; 27 }