我们能用贪婪的策略解决这个问题吗?如果不是,我们如何使用动态编程解决这个问题?

时间:2013-01-09 09:06:55

标签: c algorithm dynamic-programming greedy

问题:

Siruseri市无可挑剔的计划。城市被划分为矩形的单元格,其中M行和N列。每个牢房都有一个地铁站。有一列火车沿着每排左右运行,一条火车沿着每列从上到下运行。每列火车都在某个时间T开始,并沿着它的路线(一排或一列)来回走动。

普通列车从一个车站到另一个车站需要两个单位的时间。有一些快速列车只需要一个单位的时间从一个站到另一个站。最后,有一些慢速列车需要三个单位时间才能从一个站点开始。您可以假设任何站点的暂停时间可以忽略不计。 以下是3行4列地铁系统的说明:

S(1) F(2) O(2) F(4)
F(3) . . . .
S(2) . . . .
O(2) . . . .

每行/每列开头的标签表示列车的类型(F代表快速,O代表普通,S代表慢)及其起始时间。因此,沿着第1行行驶的火车是快速列车并且它在时间3开始。它从站(1,1)开始并向右移动,分别在时间3,4,5和6处沿着该行访问站。然后它在6,7,8和9时间从右到左返回站点。它现在再次移动,现在在9,10,11和12时间访问站点,依此类推。同样,沿着第3列的列车是从时间2开始的普通列车。因此,从车站(3,1)开始,它在第3和第4列访问第3列的三个站,返回到顶部列在6,8和10时间访问它们,依此类推。

考虑到起跑站,起跑时间和目的地站,您的任务是确定使用这些列车到达目的地的最早时间。 例如,假设我们在时间8从站(2,3)开始,我们的目标是到达站(1,1)。我们可以在时间8乘坐第二排的慢速列车,在时间11到达(2,4)。碰巧在第11列,第4列的快速列车在(2,4)向上行驶,所以我们可以乘坐这个快速列车到达(1,4)时间12.再次我们很幸运,在第12行第1行的快速列车是在(1,4),所以我们可以乘坐这个快速列车到达(1) ,1)在时间15,另一条路线是在第3栏从(2,3)在第3栏乘坐普通列车,在时间10到达(1,3)。然后我们在那里等到第13时间,然后乘坐第1排的快速列车向左行驶,在时间15到达(1,1)。您可以验证没有办法比此更早到达(1,1)。

  

测试数据:您可以假设M,N≤50   时间限制:3秒

由于N的大小,M非常小,我们可以尝试通过递归来解决它。

在每个车站,我们乘坐两列火车可以带我们离目的地更近。
例如:如果我们想从2,3乘坐1,1,我们乘坐的火车将我们带到2,3附近,然后到达目的地最近的火车站,同时跟踪时间我们认为,如果我们到达目的地,我们会记录到目前为止的最短时间,如果到达目的地的时间少于最小值,我们会更新它。

我们可以使用这种方法确定列车在特定时间的哪个站点:

/* S is the starting time of the train and N is the number of stations it
 visits, T is the time for which we want to find the station the train is at. 
T always be greater than S*/

T = T-S+1
Station(T) = T%N, if T%N = 0, then Station(T) = N;

这是我的问题:

  • 我们如何确定特定列车到达我们想要的车站的最早时间?

  • 由于我的上述算法使用贪婪策略,它会给出准确的答案吗?如果没有,那么我该如何解决这个问题呢?

P.S:这不是作业,而是online judge problem

1 个答案:

答案 0 :(得分:4)

我相信贪婪的解决方案会在这里失败,但构建反例会有点困难。

这个问题是用Dijkstra算法解决的。边缘是相邻节点之间的连接,取决于列车的类型及其起始时间。您还不需要来计算整个图形 - 仅针对您正在考虑的当前节点计算边缘。我已经解决了许多类似的问题,这就是你解决的方法。在我学会它之前,我还尝试过多次使用贪婪的东西。

希望这有帮助。