NC206 牛客网 跳跃游戏(二) 最多积分 C/C++ 动态规划

感觉有点像0-1 背包问题,找到动态转移方程,保存上一次的解,

情况一: S[i] =  Max{ nums[i] + S[i+k]};  k{1,nums[i]}S[i+k]0 。 在{1,nums[i]} 范围,存在k 使S[i+k] 不为0

情况二: S[i] =  0 ;  k{1,nums[i]}S[i+k]=0 。 在在{1,nums[i]} 范围,所有的k 都会使S[i+k] 0

时间复杂度为:(N,N^2)    空间复杂度 N。

class Solution {
public:
int maxJumpGrade(vector<int>& nums) {
if(!nums.size()) return -1;
vector<int> S(nums.size());                       //i位置到最后一个位置的最多积分,如果无法到达则为0
S[nums.size()-1] = nums[nums.size()-1]; // 初始化最后一个位置的积分
for(int i = nums.size()-2;i >=0 ;i--){
int max_jump_size = nums[i];    // 当前i可以跳的最远距离
int max_case_temp = 0;            // 当前跳跃的最好情况时的积分
for(int j= 1;j <= max_jump_size;j++){
if(i+j < nums.size() && S[i+j]!=0){ //这里i+j 可能超过最后一个位置
if(max_case_temp < nums[i] + S[i+j]){
max_case_temp = nums[i] + S[i+j];
}
}
}
if(max_case_temp == 0) S[i] =0;
else S[i] = max_case_temp;
}
if(S[0]) return S[0];
else return -1;
}
};

posted @ 2022-09-07 11:40  danieldai  阅读(72)  评论(0编辑  收藏  举报