OD C卷 - 跳格子3

跳格子3 (200)

  • 跳格子游戏,每个格子上有特定的分数,从起点score[0]开始,每次最大的步长为k, 计算跳到终点时能够得到的最大分数;
  • 格子总长度、步长在【1,100000】,每个格子的分数在【-10000,10000】

输入描述:
第一行输入总的格子数;
第二行输入格子的分数;
第三行输入最大步长k
输出描述:
最大分数值

示例1
输入:
6
1 -1 -6 7 -17 7
2
输出:
14

示例2
输入:
10
2 -3 2 5 -1 -3 -4 9 1 -3
5
输出:
16

思路:

  • 动态规划,i = 0时的分数为当前最大分数;

# 输入格子数
n = int(input().strip())
scores = list(map(int, input().strip().split()))
k = int(input().strip())

# n * 2
queue = [[0 for i in range(2)] for j in range(n)]
cache = [0 for i in range(n)]

# 起始位置
cache[0] = scores[0]
queue[0][0] = 0 #
queue[0][1] = cache[0]

index1 = 0 # 当前最大分数 的位置
index2 = 1 # 当前跳的位置

# 从第二个位置开始跳
i = 1
while i < n:
    # 步长控制
    while index1 < index2:
        # 步长超出
        if queue[index1][0] < i - k: # i 表示当前跳的位置
            index1 += 1
        else:
            break

    # 当前跳的位置分数 + 当前的最大分数
    cache[i] = scores[i] + queue[index1][1]

    while index1 < index2:
        # 向更大分数 走一步
        if queue[index1][1] <= cache[i]:
            index1 += 1

        else:
            break

    # 记录当前位置的分数
    queue[index2][0] = i  # 跳的位置
    queue[index2][1] = cache[i] # 对应分数
    index2 += 1
    i += 1

print(cache[n - 1])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值