CodeForces - 429B Working out 简单DP

Working out CodeForces - 429B

一个 n×mn\times m 的矩阵 aaa[i][j]a[i][j] 表示 iijj 列可以燃烧的卡路里,第一个人从 a[1][1]a[1][1] 开始,到 a[n][m]a[n][m] 结束,选择 a[i][j]a[i][j] 之后,他可以继续选择 a[i+1][j]a[i+1][j]a[i][j+1]a[i][j+1] ,第二个人从 a[n][1]a[n][1] 开始,到 a[1][m]a[1][m] 结束,选择 a[i][j]a[i][j] 之后可以继续选择 a[i][j+1]a[i][j+1]a[i1][j]a[i-1][j]

额外要求是他们必须在中间的某个格子里相遇一次,在相遇的格子中,两个人都不会燃烧卡路里。当其中有一个到达目的地时就开始计算总收益(总共燃烧的卡路里),问最大是多少?

f1[i][j],f2[i][j],f3[i][j],f4[i][j]f_1[i][j],f_2[i][j],f_3[i][j],f_4[i][j] 分别表示从四个角 (1,1)(1,1)(i,j)(i,j) 的最大值,从 (i,j)(i,j)(n,m)(n,m) 的最大值,从 (n,1)(n,1)(i,j)(i,j) 的最大值,从 (i,j)(i,j)(1,m)(1,m) 的最大值,然后枚举相遇点 (i,j)(i,j) 即可。

f1[i][j]=max{f1[i][j1],f1[i1][j]}+a[i][j]f2[i][j]=max{f2[i][j+1],f2[i+1][j]}+a[i][j]f3[i][j]=max{f3[i][j1],f3[i+1][j]}+a[i][j]f4[i][j]=max{f4[i][j+1],f4[i1][j]}+a[i][j] \begin{aligned} f_1[i][j]&=\max\{f_1[i][j-1],f_1[i-1][j]\}+a[i][j]\\ f_2[i][j]&=\max\{f_2[i][j+1],f_2[i+1][j]\}+a[i][j]\\ f_3[i][j]&=\max\{f_3[i][j-1],f_3[i+1][j]\}+a[i][j]\\ f_4[i][j]&=\max\{f_4[i][j+1],f_4[i-1][j]\}+a[i][j]\\ \end{aligned}

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
//#define WINE
#define N 1005
using namespace std;
int n,m,a[N][N],f1[N][N],f2[N][N],f3[N][N],f4[N][N],res;
int main(){
#ifdef WINE
    freopen("data.in","r",stdin);
#endif
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            f1[i][j]=max(f1[i][j-1],f1[i-1][j])+a[i][j];
    for(int i=n;i>=1;i--)
        for(int j=m;j>=1;j--)
            f2[i][j]=max(f2[i][j+1],f2[i+1][j])+a[i][j];
    for(int i=n;i>=1;i--)
        for(int j=1;j<=m;j++)
            f3[i][j]=max(f3[i][j-1],f3[i+1][j])+a[i][j];
    for(int i=1;i<=n;i++)
        for(int j=m;j>=1;j--)
            f4[i][j]=max(f4[i][j+1],f4[i-1][j])+a[i][j];
    res=0;
    for(int i=2;i<n;i++)
        for(int j=2;j<m;j++){
            res=max(res,f1[i-1][j]+f2[i+1][j]+f3[i][j-1]+f4[i][j+1]);
            res=max(res,f1[i][j-1]+f2[i][j+1]+f3[i+1][j]+f4[i-1][j]);
        }
    printf("%d\n",res);
    return 0;
}

在这里插入图片描述

posted @ 2020-03-27 16:20  winechord  阅读(121)  评论(0编辑  收藏  举报