题目链接
解题思路:
多维动态规划(不是两个起点的dfs),可以看做从相同地点到相同终点的两条不相交的路径。注意到两个人传的纸条经历的总路径相等。设
f
[
i
]
[
j
]
[
k
]
[
l
]
f[i][j][k][l]
f[i][j][k][l]为两人从同一起点传的路径到达
(
i
,
j
)
(i,j)
(i,j)和
(
k
,
l
)
(k,l)
(k,l)的总的值。有
i
+
j
=
k
+
l
i+j=k+l
i+j=k+l成立,当
i
=
=
k
i==k
i==k时,
j
≠
l
j\ne l
j̸=l成立则两者不相交。且有:
f
[
i
]
[
j
]
[
k
]
[
l
]
=
m
a
x
(
f
[
i
−
1
]
[
j
]
[
k
−
1
]
[
l
]
,
f
[
i
−
1
]
[
j
]
[
k
]
[
l
−
1
]
,
f
[
i
]
[
j
−
1
]
[
k
−
1
]
[
l
]
,
f
[
i
]
[
j
−
1
]
[
k
]
[
l
−
1
]
)
+
a
[
i
]
[
j
]
+
a
[
k
]
[
l
]
f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l]
f[i][j][k][l]=max(f[i−1][j][k−1][l],f[i−1][j][k][l−1],f[i][j−1][k−1][l],f[i][j−1][k][l−1])+a[i][j]+a[k][l]成立。
#include<iostream>
#include<cstdio>
using namespace std;
int a[55][55],f[55][55][55][55];
//f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],
//f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l]
int _max(int a,int b,int c,int d){
return max(max(max(a,b),c),d);
}
int main(int argc, char** argv) {
int m,n;
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=m;i++) {//i+j=k+l
for(int j=1;j<=n;j++){
for(int k=1;k<=m;k++){
int l=i+j-k;
if(l<1) continue;
f[i][j][k][l]=_max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l];
if(i==k&&j==l)
f[i][j][k][l]-=a[i][j];
}
}
}
printf("%d\n",f[m][n-1][m-1][n]);
return 0;
}