【发布时间】:2017-03-07 18:14:08
【问题描述】:
有N个城市。每个城市都有一个类型 1 到 10(含)的传送。给你一个大小为 N 的数组,用整数表示每个城市的传送类型。例如。 1 3 5 3 8 9。目标是根据以下规则找到从数组中的第一个条目到最后一个条目所需的最少小时数:
- 您可以从每个城市(数组中的条目)移动到其左侧或右侧邻居(如果有的话),该操作需要 1 小时。
- 您可以从每个城市传送到另一个与您要传送的城市具有相同传送类型的城市。在上面的示例数组中,您可以从索引 1 的城市传送到索引 3 的城市,因为它们都具有相同类型的传送:
3。此操作需要花费给定的 R 小时数。
我已经实现了一个动态编程解决方案,当最快的方式只是向前推进时,它工作得非常好。但在某些情况下,返回几个城市然后传送到前方会更快,从而最大限度地减少花费的时间。
这是我的算法失败的示例:例如。 2 1 3 4 6 8 5 7 4 2 3 5 2 1 3 4 3 5 6 7 和 R = 2
正确答案:索引0(时间=0)->索引9(时间=2)->索引8(时间=3)->索引7(时间=4)->索引19(时间=6)。
我的算法会找到仅向前移动的最快方式,显然,正确的最快方式还包括向后移动。
到目前为止,这是我的代码:
#include <iostream>
using namespace std;
int main()
{
int dp[200] = {};
short ti[200] = {};
int numCities, R;
cin >> numCities >> R;
for (int i = 0; i < numCities; i++)
{
short temp;
cin >> temp;
ti[i] = temp;
}
for (int i = 1; i < numCities; i++)
{
dp[i] = dp[i - 1] + 1;
for (int x = i - 1; x >= 0; x--)
{
if (ti[x] == ti[i])
{
if (R + dp[x] < dp[i])
dp[i] = R + dp[x];
}
}
}
cout << dp[numCities - 1];
return 0;
}
如何使我的算法适用于这种情况,其中较低的状态依赖于较大的状态?
编辑:我使用以下方式动态编程:对于每个城市,我计算给定起始状态dp[0] = 0 的最快到达它们的方法。
那么递归关系就是:dp[i] = min(dp[i - 1] + 1, dp[every other point with same teleport type] + R)
【问题讨论】:
-
我幼稚的方法是使用Dijkstra's algorithm 来解决这个问题。
标签: algorithm dynamic-programming