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本质上是一样的。
浙公网安备 33010602011771号