CodeForces 429B B.Working out

来源:互联网 发布:淘宝违法店铺举报 编辑:程序博客网 时间:2024/05/16 14:17

题目传送门

题意:给你一个n*m的网格,A在(1,1)前往(n,m),B在(n,1)前往(m,1),每个人到达一个新的网格就能得到这个网格里面的数字,两个人必须在一个网格相遇(只能相遇一次),且两个人都不能获得这个网格里面的·数字。求两个人能获得最大数字和。

思路:一开始想到枚举,但是枚举每一个点在进行运算的话时间复杂度太高了,所以就一开始预处理一遍每一个点到四个角的最大值,然后在枚举就可以了。一定要注意细节,一开始我认为如果两个人在一个点相遇后就不会在遇见了,但是这个是不对,所以我们要把两个人相遇的两个方式枚举出来,然后还要注意边界是无法相遇的一开始这个地方也没有想到。

#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <fstream>#include <iostream>#include <list>#include <map>#include <queue>#include <set>#include <sstream>#include <stack>#include <string>#include <vector>#define MAXN 1010#define MAXE 5#define INF 100000000#define MOD 1000000007#define LL long long#define pi acos(-1.0)using namespace std;LL dp[MAXE][MAXN][MAXN];LL arr[MAXN][MAXN];int main() {    std::ios::sync_with_stdio(false);    int n, m;    cin >> n >> m;    memset(dp, 0, sizeof(dp));    for (int i = 1; i <= n; ++i) {        for (int j = 1; j <= m; ++j) {            cin >> arr[i][j];        }    }    for (int i = n; i >= 1; --i) {        for (int j = m; j >= 1; --j) {            dp[1][i][j] = max(dp[1][i + 1][j], dp[1][i][j + 1]) + arr[i][j];        }        for (int j = 1; j <= m; ++j) {            dp[2][i][j] = max(dp[2][i + 1][j], dp[2][i][j - 1]) + arr[i][j];        }    }    for (int i = 1; i <= n; ++i) {        for (int j = 1; j <= m; ++j) {            dp[3][i][j] = max(dp[3][i - 1][j], dp[3][i][j - 1]) + arr[i][j];        }        for (int j = m; j >= 1; --j) {            dp[4][i][j] = max(dp[4][i - 1][j], dp[4][i][j + 1]) + arr[i][j];        }    }    LL ans = 0;    for (int i = 1; i <= n; ++i) {        for (int j = 1; j <= m; ++j) {            if (i == 1 || i == n || j == 1 || j == m)                continue;            LL sum = 0;            sum = dp[1][i][j + 1] + dp[3][i][j - 1] + dp[2][i + 1][j] + dp[4][i - 1][j];            ans = max(ans, sum);            sum = dp[1][i + 1][j] + dp[3][i - 1][j] + dp[2][i][j - 1] + dp[4][i][j + 1];            ans = max(ans, sum);        }    }    cout << ans << endl;    return 0;}
原创粉丝点击