dp-最大到達距離の最大値について
概要
- 最大、どこまでジャンプできるかが記述されたarrayがある時、末尾に到着可能かの判定
- dfs, bfsで考えるとパターンが増えすぎるので無理
- dpで直前までの記録で、どこまで到達可能かの情報を保持することで
O(n)で計算できる
具体例
def solve(nums):
dp = [-float("inf")] * len(nums)
dp[0] = nums[0]
for i in range(0, len(nums)):
# 一つ手前の情報でより遠くに行けるならばその情報を採用
if i != 0 and dp[i-1] > i:
dp[i] = max(dp[i-1], nums[i]+i)
else:
# そうでないならば、nums[i]の値が最も遠くに行ける場所
dp[i] = nums[i] + i
dp = [v-i for i, v in enumerate(dp)]
# 末尾を除き、0未満があれば、途中で途切れているので到達することはできない
if any(map(lambda x: x <= 0, dp[:-1])):
return False
return True
assert solve([2,0,0]) == True
assert solve([0]) == True
assert solve([2,3,1,1,4]) == True
assert solve([3,2,1,0,4]) == False