鉴于一个无限长度的世界(x), 可用的移动(y),例如[1,2,3,-1,-2,-3], 和目的地(d)(即15),写一个返回的函数 达到d所需的最小移动次数(结果)。
例如,如果d = 15,则结果= 5 因为最佳移动是3,它可以做5次。
此问题与此非常类似:https://www.youtube.com/watch?v=Y0ZqKpToTic 除了允许负值。
我的代码如下,仅适用于正数。是否有任何想法使其适用于混合的正面和负面价值?
class Solution {
public:
int Robotmotion(vector<int> &moves, int &d) {
if (d == 0) return 0;
if (d < 0) {
d = -d;
for (auto &move : moves) move *= -1;
}
sort(moves.begin(), moves.end());
vector<int> dp(d + 1, d + 1);
dp[0] = 0;
for (int i = 1; i <= d; i++) {
for (int j = 0; j < moves.size(); j++) {
if (moves[j] <= i) {
dp[i] = min(dp[i], dp[i - moves[j]] + 1);
}
}
}
return dp[d] == d + 1 ? -1 : dp[d];
}
};
int main() {
Solution s;
vector<int> moves = {1,2,3};
int d = 15;
int min_steps = s.Robotmotion(moves, d);
cout << "Mim steps:" << endl << min_steps << endl;
return 0;
}
答案 0 :(得分:0)
我不认为动态编程可以解决问题。相反,您应该将数字视为图形中的顶点,并使用BFS来解决问题。您甚至可以使用双向BFS来加速该过程。