机器人运动 - 动态规划

时间:2017-06-18 23:35:43

标签: c++ dynamic-programming robot

鉴于一个无限长度的世界(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;
}

1 个答案:

答案 0 :(得分:0)

我不认为动态编程可以解决问题。相反,您应该将数字视为图形中的顶点,并使用BFS来解决问题。您甚至可以使用双向BFS来加速该过程。