Maximum Number of Points with Cost

Update Jul 18, 2021

Leetcodearrow-up-right

You are given an m x n integer matrix points (0-indexed). Starting with 0 points, you want to maximize the number of points you can get from the matrix.

To gain points, you must pick one cell in each row. Picking the cell at coordinates (r, c) will add points[r][c] to your score.

However, you will lose points if you pick a cell too far from the cell that you picked in the previous row. For every two adjacent rows r and r + 1 (where 0 <= r < m - 1), picking cells at coordinates (r, c1) and (r + 1, c2) will subtract abs(c1 - c2) from your score.

Return the maximum number of points you can achieve.

abs(x) is defined as:

  • x for x >= 0.

  • -x for x < 0.

Example 1:

Input: points = [[1,2,3],[1,5,1],[3,1,1]]
Output: 9
Explanation:
The blue cells denote the optimal cells to pick, which have coordinates (0, 2), (1, 1), and (2, 0).
You add 3 + 5 + 3 = 11 to your score.
However, you must subtract abs(2 - 1) + abs(1 - 0) = 2 from your score.
Your final score is 11 - 2 = 9.

Example 2:

Input: points = [[1,5],[2,3],[4,2]]
Output: 11
Explanation:
The blue cells denote the optimal cells to pick, which have coordinates (0, 1), (1, 1), and (2, 0).
You add 5 + 3 + 4 = 12 to your score.
However, you must subtract abs(1 - 1) + abs(1 - 0) = 1 from your score.
Your final score is 12 - 1 = 11.

Constraints:

  • m == points.length

  • n == points[r].length

  • 1 <= m, n <= 105

  • 1 <= m * n <= 105

  • 0 <= points[r][c] <= 105

Basic Idea:

这道题目就是要在每一行中选择一个数,但相邻两行之间选择的col的差需要减去,问最后能得到的最大分数。因为数据量比较大,我们不可能每次对于每个col,看上面一行的所有col,于是只能想一想有没有DP的思路,将 O(C^2) 降低到 O(C))

通过思考,我们发现可以通过DP的方法算出上一行对下一行每个col能获得的最大分数,方法就是先从左往右看,再从右往左看,每个col取最大的。例如对于如下例子:

Java Code:

Last updated