zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    2012年"浪潮杯"山东省第三届ACM大学生程序设计竞赛 Fruit Ninja I
    HDU 1045
    ZOJ 3946 Highway Project
    python基础知识
    粘包问题以及解决方法
    socket套接字
    网络编程 互联网协议 tcp原理
    反射 魔法方法 单例模式
    classmethod与staticmethod isinstance与issubclass
    封装 多态
  • 原文地址:https://www.cnblogs.com/xgbt/p/15030290.html
Copyright © 2011-2022 走看看