题目连接
- 该题是CSP-J2-2020-T4
题目大意
在一个棋盘内,允许向右,或者向上、下移动,求经过的点的和最大。
题目分析
1、显然是DP题,但是和之前的方格取数(4维降3维)有一丁点区别;
2、如果对于每个点,都从三个方向过来,需要 O ( n 3 ) O(n^3) O(n3) ,能得 70 70 70 分;
3、如果分开数组做,用 d n [ i ] [ j ] dn[i][j] dn[i][j] 表示从上往下的最值, u p [ i ] [ j ] up[i][j] up[i][j] 表从下往上的最值, f [ i ] [ j ] f[i][j] f[i][j] 表示从左往右的最值,则可以在 O ( n 2 ) O(n^2) O(n2) 解答。
参考代码
//T4-方格取数
//CSP-J2-2020
//三个方向的DP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf=1e18+9;
const int maxn=1e3+9;
int n,m;
ll a[maxn][maxn],up[maxn][maxn],dn[maxn][maxn],f[maxn][maxn];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%lld",&a[i][j]);
}
}
//初始化
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
f[i][j]=up[i]