蒜国地域是一个 nn 行 mm 列的矩阵,下标均从 11开始。蒜国有个美丽的城堡,在坐标 (n, m)(n,m)上,蒜头君在坐标 (1,1)(1,1) 的位置上。蒜头君打算出发去城堡游玩,游玩结束后返回到起点。在出发去城堡的路上,蒜头君只会选择往下或者往右走,而在返回的路上,蒜头君只会选择往上或者往左走,每次只能走一格。已知每个格子上都有一定数量的蒜味可乐,每个格子至多经过一次。
现在蒜头君请你来帮他计算一下,如何计划来回行程,可以收集到最多的蒜味可乐。
输入格式
第一行输入两个整数 n,m(1 \leq n, m \leq 50)n,m(1≤n,m≤50),表示蒜国是一个 nn 行 mm 列的矩阵。
接下来输入 nn 行,每行输入 mm 个整数,代表一个 n \times mn×m 的矩阵,每个整数代表对应位置上的蒜味可乐数量,每行的每两个整数之间用一个空格隔开。其中蒜头君的位置和城堡的位置上没有蒜味可乐,用 00 表示,其余位置上的整数范围在 [1,100][1,100] 内。
输出格式
输出一行,输出一个整数,表示蒜头君在来回路上能收集到的蒜味可乐的最大值。
#include <iostream>
#include <cstring>
using namespace std;
int n,m;
int dp[60][60][60][60];
int coordination[60][60];
int main(){
// memset(dp,0,sizeof(dp));
//memset(coordination,0,sizeof(coordination));
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>coordination[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=n;k++){
for(int l=1;l<=m;l++){
if(i==k&&j==l){
continue;
}
if(i+j-k-l!=1){
dp[i][j][k][l]=max(max(dp[i-1][j][k-1]
[l],dp[i-1][j][k][l-1]),
max(dp[i][j-1][k][l-1],dp[i][j-1][k-1][l]))
+coordination[i][j]+coordination[k][l];}
else {
continue;
}
}
}
}
}
cout<<dp[n-1][m][n][m-1]<<endl;
return 0;
}