$f[k][x1][x2]表示走了k步, 第一次的线路到达(x1, k - x1),\\ 第二次的线路到达(x2, k - x2)时两条路径的最大权值, \\可以由f[k - 1][x1 - 1][x2 - 1]、f[k - 1][x1][x2 - 1]、f[k - 1][x1 - 1][x2]\\加上经过路径的权值,并取max转移得到$
// 图为m x n
for(int k = 2; k <= m + n; ++ k){
for(int x1 = 1; x1 <= m; ++ x1){
for(int x2 = 1; x2 <= m; ++ x2){
int y1 = k - x1, y2 = k - x2;
if(y1 >= 1 && y1 <= n && y2 >= 1 && y2 <= n){
int t = w[x1][y1];
// 当两点重合时,边权只能算一次
if(x1 != x2){
t += w[x2][y2];
}
int &x = f[k][x1][x2];
x = max(x, f[k - 1][x1 - 1][x2 - 1] + t);
x = max(x, f[k - 1][x1][x2 - 1] + t);
x = max(x, f[k - 1][x1 - 1][x2] + t);
x = max(x, f[k - 1][x1][x2] + t);
}
}
}
}
cout << f[m + n][m][m];