【发布时间】:2017-05-27 17:42:52
【问题描述】:
问题
给定一个长度为 [N] 的数组,您必须从数组 [0] 开始并遍历到末尾。您可以移动一个或两个位置,即 array[0] -> array[1] 或 array[0] -> array[2] 取决于哪个数字总和较低。这将一直重复到最后,并且必须包含 array[N]。
[1, 10, 3, 8, 4] 最便宜的导航方式是 = 8 via array[0] + array[2] + array[4]
我目前的解决方案:
int totalCost = 0
totalCost += array[0]
int i = 1;
while (i < array.length)
{
if (i + 1 < array.length)
{
int sum1 = totalCost + array[i];
int sum2 = totalCost + array[i + 1];
if (sum1 < sum2)
{
totalCost += array[i];
i++;
}
else
{
totalCost += array[i + 1];
i += 2;
}
}
else
{
totalCost += array[i];
i++;
}
}
这似乎适用于大多数数组...如果早期跳转会导致更大的数字,但允许更好地通过数组进一步跳转,最终会导致更低的数字,那么问题就来了。我不知道如何处理。
【问题讨论】:
-
那么您如何确定在较早时间进行较长时间的跳跃会导致较低的总体成本?只有真正完成整个路线,对吧?
-
数组中可以有负数吗?
-
@RomanPekar 我不这么认为,我唯一知道的是不允许我对数组进行排序。
-
@UnholySheep 我同意,我必须遍历整个数组才能查看所有可能的组合。我曾考虑过类似的问题,例如用阶乘来确定可能组合的总数,但这与此不完全相同。我也在考虑拥有一个包含所有可能总和的参考数组。仍然不确定我将如何考虑所有可能的选择。
标签: c# arrays algorithm recursion theory