5815. 扣分后的最大得分 dp

给你一个 m x n 的整数矩阵 points (下标从 0 开始)。一开始你的得分为 0 ,你想最大化从矩阵中得到的分数。

你的得分方式为:每一行 中选取一个格子,选中坐标为 (r, c) 的格子会给你的总得分 增加 points[r][c] 。

然而,相邻行之间被选中的格子如果隔得太远,你会失去一些得分。对于相邻行 r 和 r + 1 (其中 0 <= r < m - 1),选中坐标为 (r, c1) 和 (r + 1, c2) 的格子,你的总得分 减少 abs(c1 - c2) 。

请你返回你能得到的 最大 得分。

abs(x) 定义为:

如果 x >= 0 ,那么值为 x 。
如果 x < 0 ,那么值为 -x 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-number-of-points-with-cost
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

typedef long long ll;
class Solution {
public:
    long long maxPoints(vector<vector<int>>& points) {
        int n = points.size();
        int m = points[0].size();
        vector<vector<ll>> dp(n, vector<ll>(m, 0));

        for (int j = 0; j < m; j++) {
            dp[0][j] = points[0][j];
        }

        for (int i = 1; i < n; i++) {
            ll mx = INT_MIN;
            for (int j = 0; j < m; j++) {
                mx = max(mx, dp[i - 1][j] + j);
                dp[i][j] = max(dp[i][j], points[i][j] + mx - j);
            }

            mx = INT_MIN;
            for (int j = m - 1; j >= 0; j--) {
                mx = max(mx, dp[i - 1][j] - j);
                dp[i][j] = max(dp[i][j], points[i][j] + mx + j);
            }
        }

        ll ans = INT_MIN;
        for (int j = 0; j < m; j++) {
            ans = max(ans, dp[n - 1][j]);
        }
        return ans;
    }
};
posted @ 2021-07-19 15:14  _西瓜不甜  阅读(56)  评论(0编辑  收藏  举报