2018微软实习笔试一道dp题目总结

题意大概是说在一维数轴上起点和终点的距离是d,现在我们要从起点走到终点。每走一个单位长度消耗一个单位能量,初始时有K单位能量。同时在起点和终点之间分布一些加油站a1,a2,...an,给你加油站数量、位置以及每个加油站储油量,问你要走到终点,至少需要停在几个加油站加油。

类似于http://www.cnblogs.com/wangyiming/p/7193446.html这道题,直接用dp求解“到达一定距离至少停下来几次”的原问题并不方便,于是转换思路,采用一种“对偶”的方式求解“停下来固定次数能到达的最远距离”。定义状态dp[i][j]表示到前i个加油站为止,停了j个加油站能到达的最远距离,那么dp[i][j] = max(dp[i - 1][j - 1] + a[i], dp[i - 1][j])。最终在所有满足dp[n][j] >= d的j中,最小的一个就是答案。

这样做时间复杂度是O(n2)的,空间复杂度通过滚动数组可以压缩到O(n)。不知是否可以进一步优化。

dp问题在直接求解遇到困难的时候,不妨试试这样的思路。

原文地址:https://www.cnblogs.com/wangyiming/p/8744388.html