大家好,我是吴师兄,关注我,每天更新大厂最新笔试题解析。
小明和朋友玩跳格子游戏,有 n
个连续格子,每个格子有不同的分数,小朋友可以选择以任意格子起跳,但是不能跳连续的格子,也不能回头跳;
给定一个代表每个格子得分的非负整数数组,计算能够得到的最高分数
给定一个数列,如: 1`` ``2 3 1
输出能够得到的最高分,如: 4
备注
1 ≤ nums.length ≤ 100
0 <= nums[i] <= 1000
1 2 3 1
4
选择跳第一个格子和第三个格子
2 7 9 3 1
12
2`` ``+`` ``9`` ``+`` ``1`` ``=`` ``12
注意,本题和LC198. 打家劫舍完全一致。
# 输入分数数组
nums = list(map(int, input().split()))
# 获得格子数
n = len(nums)
# 如果长度为1,那么直接输出nums[0]
if n == 1:
print(nums[0])
# 否则,进行dp过程
else:
# 初始化长度为n的dp数组
# dp[i]表示,考虑第i个格子时,能获得的最高分数
dp = [0] * n
dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])
# 遍历剩余所有格子,
# 动态转移方程为dp[i] = max(dp[i-1], nums[i] + dp[i-2])
# 表示考虑dp[i]时,
# 可以选择其前一个位置dp[i-1]的分数
# 也可以选择其前两个位置dp[i-2]的分数加上nums[i]的分数
for i in range(2, n):
dp[i] = max(dp[i-1], nums[i] + dp[i-2])
print(dp[-1])
时间复杂度:O(N)
。
空间复杂度:O(N)
。