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;
}
};