題目:
一個M*N矩陣中有不同的正整數,經過這個格子,就能獲得相應價值的獎勵,先從左上走到右下,再從右下走到左上。第1遍時只能向下和向右走,第2遍時只能向上和向左走。兩次如果經過同一個格子,則該格子的獎勵只計算一次,求能夠獲得的最大價值。
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
int a[210][210];
int dp[420][210][210];
int m,n;
bool inRange(int x,int y) {
if(0 <= x && x < n && 0 <= y && y < m) {
return true;
}
return false;
}
int dir[2][2] = {-1,0,0,-1};
int main(){
freopen("in.txt","r",stdin);
scanf("%d%d",&m,&n);
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
scanf("%d",&a[i][j]);
}
}
memset(dp,0,sizeof(dp));
dp[0][0][0] = a[0][0];
for(int tot=1;tot<n+m-1;tot++) {
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
for(int d1=0;d1<2;d1++) {
for(int d2=0;d2<2;d2++) {
int x1 = i + dir[d1][0];
int y1 = tot - 1 - x1;
int x2 = j + dir[d2][0];
int y2 = tot -1 - x2;
if(!inRange(x1,y1) || !inRange(x2,y2)) {
continue;
}
if(i != j)
dp[tot][i][j] = max(dp[tot][i][j],dp[tot-1][x1][x2] + a[i][tot-i] + a[j][tot-j]);
else
dp[tot][i][j] = max(dp[tot][i][j],dp[tot-1][x1][x2] + a[i][tot-i]);
}
}
}
}
}
printf("%d\n",dp[n+m-2][n-1][n-1]);
}