题目
2140.解决智力问题
一眼动态规划
简单动态规划 超时dfs做法:dfs肯定超时,但是为了更加清晰说明动态规划,新手可先写dfs,再进行改成动态规划
class Solution {
public:
long long mostPoints(vector<vector<int>>& questions) {
vector<vector<int>> maps(questions.size(), vector<int>(100, 0));
function<int(int)> dfs = [&](int index){
if(index>=questions.size()) return 0;
int ans_1 = dfs(index+1);
//解决
int ans_2 = dfs(index+questions[index][1]+1)+questions[index][0];
return max(ans_1, ans_2);
};
return dfs(0);
}
};
动态规划
class Solution {
public:
long long mostPoints(vector<vector<int>>& questions) {
int n = questions.size();
vector<long long> f(n+1, 0);
for(int i=n-1;i>=0; i--){
int nexts = questions[i][1]+i+1;
long long ans_1 = f[i+1]; // 不解决当前前问题
// 超过了就为当前值
long long ans_2 = (nexts<=n)?(f[nexts]+questions[i][0]):static_cast<long long>(questions[i][0]); // 解决当前问题
f[i] = max(ans_1, ans_2);
}
return f[0];
}
};
class Solution:
def mostPoints(self, questions: List[List[int]]) -> int:
n = len(questions)
f = [0]*(n+1)
for i in range(n-1, -1, -1):
next_index = i+questions[i][1]+1
ans_1 = f[i+1]
if next_index<=n:
ans_2 = f[next_index]+questions[i][0]
else:
ans_2 = questions[i][0]
f[i] = max(ans_1, ans_2)
return f[0]
ans_2
中等于不等于n都行,因为开辟了n+1个,此时无论如何都是当前的分数。