给定一个非负整数数组nums,假定最开始处于下标为0的位置,数组里面的每个元素代表下一跳能够跳跃的最大长度,如果可以跳到数组最后一个位置,请你求出跳跃路径中所能获得的最多的积分。
1.如果能够跳到数组最后一个位置,才能计算所获得的积分,否则积分值为-1
2.如果无法跳跃(即数组长度为0),也请返回-1
3.数据保证返回的结果不会超过整形范围,即不会超过
数据范围:
第一行输入一个正整数 n 表示数组 nums的长度第二行输入 n 个整数,表示数组 nums 的所有元素的值
输出能获得的最多的积分
6 2 4 2 1 0 100
106
首先位于nums[0]=2,然后可以跳1步,到nums[1]=4的位置,积分=2+4=6,再跳到nums[5]=100的位置,积分=6+100=106
这样保证既能跳到数组最后一个元素,又能保证获取的积分最多
6 2 4 0 2 0 100
108
跳跃路径为:2=>4=>2=>100,总共为108
6 2 3 2 1 0 100
-1
跳不到最后一个位置,返回-1
package main import ( "fmt" ) func main() { for { var n int _, err := fmt.Scan(&n) if err != nil { break } nums := make([]int, n) for i := range nums { fmt.Scan(&nums[i]) } fmt.Println(solve(nums)) } } func solve(nums []int) int { n := len(nums) if n == 0 { return 0 } canReachs := make([]bool, n) canReachs[n-1] = true r := n-1 for i := n-2; i >= 0; i-- { if i+nums[i] >= r { r = i canReachs[i] = true } } if r > 0 { return -1 // 不可达 } score := 0 for i := 0; i < n; { if canReachs[i] { score += nums[i] } k := 1 for k := 1; k <= nums[i] && i+k<n && !canReachs[i+k]; k++ {} i += k } return score }