这题真没啥难的,就是单纯拿来给我练手的
10min切掉
首先很明显dp(我居然还想了一会儿她到底能不能用)
但是由于题目说的是要传过去还要回来,其实就相当于选两条路,没有交点
用$f[i][j][k][l]$表示两条路径分别走到$(i,j)$和$(k,l)$时路径最大值。
注意因为没有交点要特判
f(i==k&&j==l) continue
然而我们可以发现一个小规律:$i+j=k+l$所以呢
我们可以杀掉一维,枚举$i,j,k$这时候$l$就可以出来啦~
完结撒花!
#include<bits/stdc++.h>
using namespace std;
int f[120][60][60];
int n,m;
int c[120][120];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=n;k++){
int l=i+j-k;
if(i==k&&j==l&&(i!=n||j!=m)) continue;
f[i][j][k]=max(max(f[i-1][j][k-1],f[i-1][j][k]),max(f[i][j-1][k-1],f[i][j-1][k]))+c[i][j]+c[k][l];
//cout<<i<<" "<<j<<" "<<k<<" "<<l<<"__________";
//cout<<f[i][j][k]<<endl;
}
}
}
cout<<f[n][m][n]<<endl;
return 0;
}
/*3 3
0 9 9
6 1 8
2 3 0*/