818. Race Car
https://leetcode.com/problems/race-car/submissions/
/*
* @lc app=leetcode id=818 lang=cpp
*
* [818] Race Car
*/
class Solution {
public:
int racecar(int target) {
vector<int> dp(target + 1);
for (int i = 1; i <= target; ++i) {
dp[i] = INT_MAX; // 跑完i距离需要的最短步数
int j = 1, cnt1 = 1;
// 正向不断加速到i前的每个可能的j位置(最远到2^N - 1)
for (; j < i; j = (1 << ++cnt1) - 1) {
// 调头再调回来让速度reset回1,不断正向加速到k位置, 再解决子问题: 跑(i - (j - k))需要的最少步数
for (int k = 0, cnt2 = 0; k < j; k = (1 << ++cnt2) - 1) {
dp[i] = min(dp[i], cnt1 + 1 + cnt2 + 1 + dp[i - (j - k)]);
}
}
// 此时j所在为刚好正向跑过i, 再回头跑到i
dp[i] = min(dp[i], cnt1 + (i == j ? 0 : 1) + dp[j - i]);
}
return dp[target];
}
};
Last updated