力扣 2140 解决智力问题
反向dp,反向遍历questions数组,每次可以选择解决与不解决,取最大得分。
设dp[i]为从当前位置i到最后解决问题能够获得的最大得分。显然如果选择解决当前问题,则接下来questions[i][1]个问题无法解决,那么获得的分数为questions[i][0] + dp[1 + i + questions[i][1]]。如果不解决当前问题,则获得的得分为dp[i+1],二者取最大。
class Solution {
public long mostPoints(int[][] questions) {
int len = questions.length;
long dp[] = new long [len + 1];
long max = 0;
for(int i = 0; i < len; i++){
dp[i] = questions[i][0];
}
for(int i = len - 1; i >= 0; i--){
if(questions[i][1] + i + 1 < len){
dp[i] = Math.max(dp[i + 1],questions[i][0] + dp[1 + i + questions[i][1]]);
}else{
dp[i] = Math.max(questions[i][0],dp[i + 1]);
}
max = Math.max(max,dp[i]);
}
return max;
}
}
浙公网安备 33010602011771号