青蛙用石头跳过一条河

时间:2016-10-05 18:16:03

标签: algorithm

这与经典的鳕鱼Frog-River-One不同,叶子在不同时间出现问题。

Problem statement

有一部分被切断了:如果猴子可以跳过河流,那么函数会返回0.如果不可能跳过河流,那么-1。

一些测试用例包括:

[[ - 1,5,-1,5,-1,10],3] - >返回5

[[1,-1,0,2,3,5],3] - >返回2

[[0,0,0,0,0,0],3] - >返回0

图像有问题描述。我使用递归以蛮力的方式做到这一点,虽然我相信它返回了正确的答案,但它可能不够好,因为它会产生O(n ^ D)的运行时间。

有没有办法更有效地解决这个问题?我没看到什么?我觉得可能有一个DP解决方案或者像一个简单的数学技巧......我附上我的解决方案供参考。

My recursive solution with explanation

1 个答案:

答案 0 :(得分:2)

请注意,您可以通过以下递归关系表达x = i的最早时间:

shortest[i] = if A[i] = -1 then +inf 
              else max(A[i], min{shortest[j] | i - D <= j < i})

首先,只有一个简单的O(ND)解决方案,只使用动态编程。

实际上,这可以使用有效的算法减少到O(N + D),以便在滑动窗口shortest上保持[i-D ... i]的最小值(使用双端队列)。