题意:在一条铁路上有N个火车站,只有三种票,求两个车站之间的最少花费
方法:一开始以为是一道简单题,很NC的开了一个二位数组,很可惜,MLE了,而且中间还很SB的想到了用记忆化搜索可能比构建更快一些。。。
经过大牛们的悉心指导,原来用一维就可以搞定 转移方程为f[j] = min(f[i] + GetCost(i,j)) (start <= i < j , start + 1 < j <=end) 不优化可能要超时,所以可以从j-1到start的方向寻找i ,中间不行即可break,算是一个剪枝吧。
代码: O(n^2)
其实还有O(n)的算法,关键在于寻找f[i]的时候只需要找三个地方
用一个p[i][j] 表示距离车站i 用第j中票能买到的最近的车站
这样转移方程就变成了f[j] = min(f[ p[j][k] ] + cost[j])
注意两个地方:第一个是计算P的时候需要istart和iend,所以要先交换再计算。第二个地方比较淫荡,当p[j][k]==j的时候,
f[j] > f[ p[j][k] ] + cost[k] 可能成立,因为f[j]开始赋值为INT_MAX,溢出了。。
代码: