【发布时间】:2022-01-06 04:29:01
【问题描述】:
优化 leetcode 风格的问题 - DP/DFS
任务如下:
- 给定 N 个高度,找出从开始到结束所需的次优跳跃的最小数量。 [一维数组]
- 如果起点 i 的高度小于或等于目标点 j 的高度,则跳跃是次优的。
- 如果 j-i >= k,则可以进行跳跃,其中 k 是最大跳跃距离。
- 对于第一个子任务,只有一个 k 值。
- 对于第二个子任务,有两个k值;输出每个 k 值的次优跳跃量。
- 对于第三个子任务,有100k个值;输出每个 k 值的次优跳跃量。
我的尝试
下面的 sn-p 是我解决问题的方法,它给出了正确的解决方案。
这是为了处理多个 k 值而优化的,而不必做很多不必要的工作。 问题在于,即使是具有单个 k 值的解决方案,在最坏的情况下也是 o(n^2)。 (因为 k
def solve(testcase):
N, Q = 10, 1
h = [1 , 2 , 4 ,2 , 8, 1, 2, 4, 8, 16] # output 3
# ^---- + ---^ 0 ^--- + --^ + ^
k = [3]
l_k = max(k)
distances = [99999999999] * N
distances[N-1] = 0
db = [ [0]*N for i in range(N)]
for i in range(N-2, -1, -1):
minLocalDistance = 99999999999
for j in range(min(i+l_k, N-1), i, -1):
minLocalDistance = min(minLocalDistance, distances[j] + (h[i] <= h[j]))
db[i][j] = distances[j] + (h[i] <= h[j])
distances[i] = minLocalDistance
print(f"Case #{testcase}: {distances[0]}")
注意:这不同于经典的 min。跳跃问题
【问题讨论】:
标签: python algorithm dynamic-programming