【问题标题】:find cheapest path through array (recursion)通过数组找到最便宜的路径(递归)
【发布时间】:2015-10-18 18:40:59
【问题描述】:

我目前正在研究递归,但我一直被这个问题困扰:

使用递归找到通过数组的最便宜的路径。例如,如果我有一个数组 [0,1,3,4,1],我从值 0 开始。现在我有 2 个选项,我可以跳转到索引 2 或只是移动到索​​引 1。在这种情况下,我会跳转右到索引 2(值 3)然后跳转到索引 4(值 1),因为 3+1= 4,这将是通过数组的最便宜的方式。

我尝试将移动索引值与跳转索引值进行比较,看看哪个是最小的,但在这种情况下,这不起作用,因为如果我将移动值 (1) 与跳转值 (3) 进行比较,则 1 是最小的我的程序会将其视为正确的路径,而实际上并非如此,而 3 是更好的选择。

感谢您抽出宝贵时间提供帮助!

【问题讨论】:

  • 解释你“跳”到这些指数的理由。
  • 对不起。为此,我们只能跳跃或移动。跳跃 = 前进 2 格,移动 = 前进 1 格。因此,为了找到最便宜的路径,我会跳到值 3,然后跳到值 1。所有其他可能性都更“昂贵”。
  • 这仍然没有意义。你应该描述递归在这里扮演的角色,以及你用来跳转的基本原理(它是数组中的值,就像我在想的那样?)。
  • 游戏的目标是以最低的总成本从第一列移动到最后一列。您总是从第一列开始游戏并且有两种类型的移动:您可以移动到相邻的列或跳过相邻的列以降落两列。博弈成本是已访问列的成本之和。所以这就是递归解决方案发挥作用的地方。如何决定走哪条路?
  • @Makoto 他的意思是从数组中的某个索引i 可以转到索引i+1i+2,这样他必须到达数组的末尾。对于他访问的每个索引,他都会添加它的值。目标是找到一条通过数组的路径,总价值最小。

标签: java arrays recursion


【解决方案1】:

您可以使用动态规划解决这个问题。假设我们创建一个数组 dp,其中 dp[i] 表示到达位置 i 的最小成本。 我们可以使用以下方法将此数组填充到输入的大小:

for(i=1;i<=len;i++) 
   //we can reach at current position either by i-1 or by i-2
   //choose one which gives minimum cost and +arr[i] cost of current position
   dp[i] = min(dp[i-1],dp[i-2])+arr[i]

我们可以通过前一个位置通过一次移动或通过 i-2 通过跳跃 2 到达第 i 个位置。因此通过这种方式,您可以找到到达最终位置的最小成本。所以 dp[len]将是您到达最后一个位置的最低成本。 还有一个类似的问题here

【讨论】:

  • 你也可以使用递归来解决这个问题,但这需要指数级的时间。这就是为什么我写了一个 O(n) 方法。
  • 绝对欣赏 O(n) 方法,但我目前正在阅读有关递归的一章,这个问题困扰了我很长时间。
  • 然后您可以将函数设为int recurse(vector&lt;int&gt;&amp;arr, int cur, int cost),其中 cur 表示您需要从哪个位置到达终点,基本条件将是 cur == len 和 cost 将是到达 cur 位置的最小成本.
  • 这里是 C++ 的现场演示 cpp.sh/3zvg 你可以用 java 制作类似的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 2012-05-20
  • 2016-01-20
  • 1970-01-01
相关资源
最近更新 更多