1. 题目来源
前导题:[M前缀和] lc1014. 最佳观光组合(思维+前缀和+算法优化)
2. 题目解析
数据范围 1e5
,并注意到 m*n
是 1e5
,朴素的 dp 必然超时。
朴素 dp
,三重循环直接暴力进行状态转移,显然是错误的。需要进行 dp
优化,看这情况也只能优化状态转移部分。
基本上就是这个优化思路,配合前导题 [M前缀和] lc1014. 最佳观光组合(思维+前缀和+算法优化) 做就行了。就是要在 O ( 1 ) O(1) O(1) 的时间完成状态转移。直接拿两个变量来维护前缀、后缀最大值就行了。也可以直接优化到一维去,因为本层状态仅与上层有关。
等一手官方题解吧。
时间复杂度: O ( n m ) O(nm) O(nm)
空间复杂度: O ( n m ) O(nm) O(nm)
class Solution {
public:
long long maxPoints(vector<vector<int>>& points) {
typedef long long LL;
int n = points.size(), m = points[0].size();
vector<vector<LL>> f(n, vector<LL>(m));
for (int i = 0; i < m; i ++ ) f[0][i] = points[0][i];
for (int i = 1; i < n; i ++ ) {
LL L = -1e9, R = -1e9;
for (int j = 0; j < m; j ++ ) {
L = max(L, f[i - 1][j] + j);
f[i][j] = max(f[i][j], 0ll + points[i][j] - j + L);
}
for (int j = m - 1; ~j; j -- ) {
R = max(R, f[i - 1][j] - j);
f[i][j] = max(f[i][j], 0ll + points[i][j] + j + R);
}
}
LL res = -1e9;
for (int i = 0; i < m; i ++ ) res = max(res, f[n - 1][i]);
return res;
}
};