2140、解决智力问题
题目
解答
正向不好做,反向遍历。
定义: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]即可
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]);elsedp[i]=max(dp[i+1],(long long)questions[i][0]+dp[i+1+questions[i][1]]);}return dp[0];}
};
时间复杂度O(n)
空间复杂度O(n)