375. Guess Number Higher or Lower II

在这里插入图片描述

这道题可以用由下到上和由上到下(+memo)来做。

class Solution {
public:
    int getMoneyAmount(int n) {
        map<pair<int, int>, int> m;
        return helper(m, 1, n);
    }
private:
    int helper(map<pair<int, int>, int>& m, int i, int j) {
        if (i > j)
            return 0;
        if (i == j)
            return 0;
        auto p = make_pair(i, j);
        if (m.find(p) != m.end())
            return m[p];
        int val = INT_MAX;
        for (int k = i; k <= j; ++k) {
            val = min(val, k + max(helper(m, i, k-1), helper(m, k+1, j)));
        }
        m[p] = val;
        return val;
    }
};
class Solution {
public:
    int getMoneyAmount(int n) {
        vector<vector<int>> dp(n+1, vector<int>(n+1, 0));
        for (int i = n; i >= 1; --i)
            for (int j = i; j <= n; ++j) {
                if (i == j)
                    dp[i][j] = 0;
                else {
                    int val = INT_MAX;
                    for (int k = i; k <= j; ++k)
                        val = min(val, k + max(dp[i][k-1], (k+1 > n? 0 : dp[k+1][j])));
                    dp[i][j] = val;
                }
            }
        return dp[1][n];
    }
};

所以说top-down+memo应该是一种备用方法。它比较容易写,和我们平时的思路一样(但是比较慢?)。和bottom-up本质上是一样的。

posted @ 2019-09-10 10:29  于老师的父亲王老爷子  阅读(23)  评论(0)    收藏  举报