题目

解答
正向不好做,反向遍历。
定义:dp[i] [i,n)的分数
初始化:dp[n]=0
递推:dp[i]=max(dp[i+1],questions[i][0]+dp[i+questions[i][1]+1]) 如果越界了,就截断到dp[n]
最后return dp[0]即可
cpp
class Solution {
public:
long long mostPoints(vector<vector<int>>& questions) {
int n = questions.size();
//定义dp[i]:[i,n)的分数
//dp[i]=max(dp[i+1],questions[i][0]+dp[i+questions[i][1]+1])
//如果i+questions[i][1]>=n 则dp[i]=max(dp[i+1],questions[i][0])
vector<long long> dp(n+1);
dp[n] = 0;
for(int i=n-1;i>=0;i--){
if(i+questions[i][1]>=n)
dp[i]=max(dp[i+1],(long long)questions[i][0]);
else
dp[i]=max(dp[i+1],(long long)questions[i][0]+dp[i+1+questions[i][1]]);
}
return dp[0];
}
};
时间复杂度O(n)
空间复杂度O(n)