LeetCode——1937. 扣分后的最大得分[Maximum Number of Points with Cost][中等]——分析及代码[Java]

  • 一、题目
  • 二、分析及代码
    • 1. 动态规划
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

给你一个 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 。

示例 1:

输入:points = [[1,2,3],[1,5,1],[3,1,1]]
输出:9
解释:
最优方案选中的格子,坐标分别为 (0, 2),(1, 1) 和 (2, 0) 。
你的总得分增加 3 + 5 + 3 = 11 。
但是你的总得分需要扣除 abs(2 - 1) + abs(1 - 0) = 2 。
你的最终得分为 11 - 2 = 9 。

示例 2:

输入:points = [[1,5],[2,3],[4,2]]
输出:11
解释:
最优方案选中的格子,坐标分别为 (0, 1),(1, 1) 和 (2, 0) 。
你的总得分增加 5 + 3 + 4 = 12 。
但是你的总得分需要扣除 abs(1 - 1) + abs(1 - 0) = 1 。
你的最终得分为 12 - 1 = 11 。

提示:

  • m == points.length
  • n == points[r].length
  • 1 <= m, n <= 10^5
  • 1 <= m * n <= 10^5
  • 0 <= points[r][c] <= 10^5

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

二、分析及代码

1. 动态规划

(1)思路

根据题意,依次在每一行中选取格子后,所得到的分数实际上只和上一行选取格子后得到的总分有关,因此可结合动态规划方法求解。

设计一个数组 dp[i],表示当前行第 i 个格子被选中时的最大得分。若上一行对应位置的总分为 lastLine[i],则 dp[i] = Math.max(lastLine[j] - |i - j|) + points[line][i], 0 <= j < n。

为简化每个格子最高分数的求解,可进一步结合动态规划方法,预处理计算各个位置选取上一行的左、右侧格子所能得到的最高分。

完成全部遍历后,dp[i] 即为最后一行各个格子被选取时得到的最高分,最大值就是所求解。需要注意的是,本题的数据范围可能超出 int,因此全程需采用 long 结构编写代码。

(2)代码

class Solution {public long maxPoints(int[][] points) {//初始化int m = points.length, n = points[0].length;long[] dp = new long[n];//dp[i]表示当前行第i个格子被选中时的最大得分for (int i = 0; i < n; i++)dp[i] = points[0][i];//第0行格子的最大得分就是对应格子的分数//动态规划for (int i = 1; i < m; i++) {long[] lastLine = dp.clone();//复制得到上一行各个格子的最大得分//预处理计算各个位置选取上一行的左、右侧格子所能得到的最高分,为简化代码,当前位置正上方的格子统计在左侧中long[] left = new long[n], right = new long[n];left[0] = lastLine[0];for (int j = 1; j < n; j++)left[j] = Math.max(left[j - 1] - 1, lastLine[j]);right[n - 1] = 0;for (int j = n - 2; j >= 0; j--)right[j] = Math.max(right[j + 1] - 1, lastLine[j + 1] - 1);//计算各个格子的最大得分for (int j = 0; j < n; j++)dp[j] = Math.max(left[j], right[j]) + points[i][j];}//统计答案,即求最后一行中各个格子的最大得分long ans = 0L;for (int i = 0; i < n; i++)ans = Math.max(ans, dp[i]);return ans;}
}

(3)结果

执行用时 :20 ms,在所有 Java 提交中击败了 100.00% 的用户;
内存消耗 :68.6 MB,在所有 Java 提交中击败了 100.00% 的用户。
(目前提交用户量不足,暂无排名)

三、其他

暂无。

LeetCode——1937. 扣分后的最大得分(Maximum Number of Points with Cost)[中等]——分析及代码(Java)相关推荐

  1. LeetCode 1937. 扣分后的最大得分(动态规划)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 m x n 的整数矩阵 points (下标从 0 开始). 一开始你的得分为 0 ,你想最大化从矩阵中得到的分数. 你的得分方式为:每一行 中 ...

  2. LeetCode——1846. 减小和重新排列数组后的最大元素(Maximum Element After Decreasing and Rearranging)[中等]——分析及代码(Java)

    LeetCode--1846. 减小和重新排列数组后的最大元素[Maximum Element After Decreasing and Rearranging][中等]--分析及代码[Java] 一 ...

  3. 5815. 扣分后的最大得分

    给你一个 m x n 的整数矩阵 points (下标从 0 开始).一开始你的得分为 0 ,你想最大化从矩阵中得到的分数. 你的得分方式为:每一行 中选取一个格子,选中坐标为 (r, c) 的格子会 ...

  4. leetcode 1937. Maximum Number of Points with Cost

    题目 解法:暴力动态规划,tle 三维的dp,提交不能通过 class Solution {public:long long maxPoints(vector<vector<int> ...

  5. LeetCode——1849. 将字符串拆分为递减的连续值(Splitting a String Into Descending Consecutive Val..)[中等]——分析及代码(Java)

    LeetCode--1849. 将字符串拆分为递减的连续值[Splitting a String Into Descending Consecutive Values][中等]--分析及代码[Java ...

  6. LeetCode——1947. 最大兼容性评分和(Maximum Compatibility Score Sum)[中等]——分析及代码(Java)

    LeetCode--1947. 最大兼容性评分和[Maximum Compatibility Score Sum][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 状态压缩 + 动态 ...

  7. LeetCode——1834. 单线程 CPU(Single-Threaded CPU)[中等]——分析及代码(Java)

    LeetCode--1834. 单线程 CPU[Single-Threaded CPU][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 优先队列 (1)思路 (2)代码 (3)结果 ...

  8. LeetCode——787. K 站中转内最便宜的航班(Cheapest Flights Within K Stops)[中等]——分析及代码(Java)

    LeetCode--787. K 站中转内最便宜的航班[Cheapest Flights Within K Stops][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 ( ...

  9. LeetCode——1143. 最长公共子序列(Longest Common Subsequence)[中等]——分析及代码(Java)

    LeetCode--1143. 最长公共子序列[Longest Common Subsequence][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 (2)代 ...

最新文章

  1. 学习编程能够从事哪些行业?
  2. 非阻塞模式与阻塞模式
  3. wxWidgets 线程示例
  4. Android高级-Android操作SQL数据管理,增删改查
  5. 序列化Image到byte[]
  6. 医学超声成像—合成孔径法(Synthetic Aperture Methods)[3]
  7. 追梦App系列博客——需求分析报告
  8. 夜神模拟器报错 daemon still not running error: cannot connect to daemon
  9. python码合并txt文件
  10. 基于java的企业合同管理系统设计(含源文件)
  11. [Swift]UIButton文本添加下划线
  12. 【Python学习笔记】超详细Python快速入门教程(下)
  13. 龙蜥操作系统(Anolis OS)安装DDE桌面
  14. Docker学习01---狂神说
  15. 我的职业生涯(八) 自我疗伤
  16. 图片资源中总会出现thumb.db文件
  17. android开发_表单上传图片及其它参数
  18. 分布式调度框架Elastic-Job
  19. LeetCode546-20.8.15-移除盒子
  20. 企业微信自定义客户画像

热门文章

  1. os判断文件是否存在不存在创建
  2. html菜单箭头,html – 纯CSS选择菜单/下拉菜单:如何制作右箭头功能?
  3. OAM概念及KubeVela基础知识学习
  4. oracle oam nginx,如何基于 OAM 编写一个扩展 Trait?
  5. Spring及Springboot 异步请求
  6. 物理机上架设云服务器
  7. 【观察】中心回归制造业:BAT是互联网的终局,GMH是物联网的开局?
  8. 鲸探发布点评:7月6日发售陈孟昕系列绘画数字藏品
  9. 计算机在食品质量安全中的应用,计算机信息技术在乳制品质量安全追溯体系中的应用...
  10. 通达信c语言接口是什么?