【发布时间】:2026-02-10 00:40:01
【问题描述】:
大家好,这是我在这里的第一篇文章。
所以今天在我的大学课上,我们的教授给了我们一个任务来写一个算法:
编写一个函数,返回在棋盘游戏中获得最高分所需的步数:
游戏规则:
- 您掷骰子并相应移动(1-6 步)。
- 棋盘上的棋子数量可以在 2 - 99 999 之间。
- 当您踩到一块瓷砖时,您会获得或失去积分(每个瓷砖上的积分从 -99 999 到 99 999 不等)。
- 如果你在棋盘的尽头并且你的掷骰子让你脱离了它的边界,你就不会移动。
我的方法
这是一种贪心算法:
- 如果每一步大于或等于 0,则计数,
- 如果是负数,请检查接下来的 6 个图块并移至得分最高的图块,以减少分数。
在我想象了这个例子之后,我意识到我的方法是错误的:
想象一个包含 {1, -40, -40, -40, -40, -1, -38, -40, -40, -40, -40, -40, 1} 的数组
我的贪心算法从 1 开始,看到四个 -40,一个 -38 和一个 -1。它选择 -1 是因为它是最好的选择,但现在我们将得到以下结果:1 + (-1) + (-38) + 1 = -37,但是如果我们选择 -38 而不是 -1,我们最终会是:1 + (-38) + 1 = -36。
这只是问题的一个简单示例,我想我必须检查每条可能的路径,因为贪心算法不会检查那里的最佳路径,只检查最适用于某些特定的路径时刻。
我想知道这里是否可以选择包含所有可能性的图,但是如果我们只有一个负数数组,那么我们最终会得到一个最大大小约为 (99999^6?) 的图,这会导致占用过多的内存。
我是新手,我的想法已经用完了。谁能指出我正确的方向?
【问题讨论】:
-
是否指定必须使用贪心算法?
-
正如您所确定的,贪婪的方法并不总是给出正确的答案。但是,基于递归/动态编程的方法可能会。给定您的分数数组
A,将best(A, i)定义为您可以从索引i开始获得的最佳分数。您需要解决best(A, 0),并且因为可以执行 1-6 步,best(A, 0) = A[0] + max(best(A, k))为1 <= k <= 5。从这里,您可以为A的任意索引定义一般重复。 -
更新了我的答案以包含一个贪婪的解决方案。
-
也许会在我们迭代时保留数组中每个项目的步数和最佳分数的历史记录。因此,对于数组中的每个新项目,我们通过将步骤添加到最后六个空格中的任何一个来找到最佳分数。每个数组大小最多使用一个 int 和一个 long,但如果您真的想尽量减少内存使用,则可以删除任何超过六个空格的结果。
-
不,我不需要使用贪心算法,这只是我解决这个问题的方法。 @亚历克斯
标签: java arrays algorithm greedy