CodeForces 429B Working out // 递推dp

题目描述

CodeForces 429B Working out

解题思路

题目大意:
有n*m个格子, 走过一个格子可以得到相应的分数.
A 从(1,1)沿 下 或 右 走到(n,m)
B 从(n,1)沿 上 或 右 走到(1,m)
两人路径有且只能有一个格子重合(重合格子的分数不算), 求两人分数之和的最大值.

首先要保证只有一个格子重合,那么只可能是以下两种情况:
1) A向右走,相遇后继续向右走,而B向上走,相遇后继续向上走
2) A向下走,相遇后继续向下走,而B向右走,相遇后继续向右走

接着枚举相遇的格子(i,j)即可,考虑四个方向的dp

dp1[i][j] := 从 (1, 1) 到 (i, j) 的最大分数
dp2[i][j] := 从 (i, j) 到 (n, m) 的最大分数
dp3[i][j] := 从 (n, 1) 到 (i, j) 的最大分数
dp4[i][j] := 从 (i, j) 到 (1, m) 的最大分数

参考代码

#include <cstdio>
using namespace std;
const int MAX_N = 1010;
inline int max(int a, int b) {return a>b?a:b;}
int dp1[MAX_N][MAX_N], dp2[MAX_N][MAX_N], dp3[MAX_N][MAX_N], dp4[MAX_N][MAX_N];
int a[MAX_N][MAX_N];
int main() {
    int n, m;
    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)
            dp1[i][j] = a[i][j] + max(dp1[i-1][j], dp1[i][j-1]);
    for (int i = n; i >= 1; --i)
        for (int j = m; j >= 1; --j)
            dp2[i][j] = a[i][j] + max(dp2[i][j+1], dp2[i+1][j]);
    for (int i = n; i >= 1; --i)
        for (int j = 1; j <= m; ++j)
            dp3[i][j] = a[i][j] + max(dp3[i][j-1], dp3[i+1][j]);
    for (int i = 1; i <= n; ++i)
        for (int j = m; j >= 1; --j)
            dp4[i][j] = a[i][j] + max(dp4[i-1][j], dp4[i][j+1]);
    int ans = 0;
    for (int i = 2; i < n; ++i)
        for (int j = 2; j < m; ++j) {
            ans = max(ans, dp1[i][j-1] + dp2[i][j+1] + dp3[i+1][j] + dp4[i-1][j]); // 对应情况1)
            ans = max(ans, dp1[i-1][j] + dp2[i+1][j] + dp3[i][j-1] + dp4[i][j+1]); // 对应情况2)
        }
    printf("%d\n", ans);
    return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值