目录
题目
题目链接https://www.luogu.com.cn/problem/P7074
思路
用dp[i][j][0]表示在(i,j)从左边来的最大值
用dp[i][j][1]表示在(i,j)从上边来的最大值
用dp[i][j][2]表示在(i,j)从下边来的最大值
详见下图
code
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int n, m;
LL mp[1001][1001];
LL dp[1001][1001][3];
LL dfs(int x, int y, int k) {
if (x < 1 or x > n or y < 1 or y > m) return INT_MIN;//判断是否越界
if (dp[x][y][k] != INT_MIN) return dp[x][y][k];//有没有算过
dp[x][y][k] = mp[x][y];//方便后面加
if (k == 0) {//每一个方向
dp[x][y][k] += max(max(dfs(x, y - 1, 1), dfs(x, y - 1, 0)), dfs(x, y - 1, 2));
return dp[x][y][k];
}
if (k == 1) {//每一个方向
dp[x][y][k] += max(dfs(x - 1, y, 0), dfs(x - 1, y, 1));
return dp[x][y][k];
}
if (k == 2) {//每一个方向
dp[x][y][k] += max(dfs(x + 1, y, 0), dfs(x + 1, y, 2));
return dp[x][y][k];
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> mp[i][j];
dp[i][j][0] = dp[i][j][1] = dp[i][j][2] = INT_MIN;
}
}
dp[1][1][0] = dp[1][1][1] = dp[1][1][2] = mp[1][1];
cout << max(dfs(n, m, 0), dfs(n, m, 1));//2不用,不可能从下面来
return 0;
}
/*
* 0→
* 1↓
* 2↑
*/