[多路dp]更难的矩阵取数问题

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 }
原文地址:https://www.cnblogs.com/elpsycongroo/p/6842975.html