题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2059
代码网上很多,大同小异。
给个链接http://blog.163.com/lovejingru@yeah/blog/static/867524782010102210213557/
解法大都是DP,代码很简单。这里解释两个难点。(本人第一次用DP,想了很久才明白)
1、这个关键的式子TIME[A,B]=TIME[A,K]+Direct[K,B]
2、没有考虑不加油的问题
3、没有考虑油还剩余的问题
对第一个问题:
到达某一个加油站B的最短时间实际就是到达它之前某一个加油站K最短时间(可能是起点)+加油站K直接到B的时间。即:TIME[A,B]=TIME[A,K]+Direct[K,B];这里有一个疑问,我当时很长时间都没搞清楚,就是Direct[K,B]为什么要从加油站K直接到B而不是先经过某一个加油站M然后再到B,其实这很简单,我们假设起点为A,并且计算从A先到某一加油站K,然后再由K先经过某一加油站M,然再由M直接到终点B,即:A...K,..M--B..这样的话其实就变为了,从加油站A到M(A。K+K。M)的最短时间+再从M到B的时间了,而M本身其实就是某一个K。重复了。。。
对第二个问题:
Direct[K,B]这一步已经把不加油的全跳过去了,K之前已经包括了加油不加油的所有情况,第二重循环是该步也包括了所有情况
对第三个问题:
同2,没跳过的都是要加油的,不管还剩不剩了
(A ,K-1, B)已经包括不再K点加油的情况了。