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;
}
};