二分法,这道题还是有难度的!
class Solution {
public:
int getMoneyAmount(int n) {
vector<vector<int>> dp(n+1, vector<int>(n+1, 0));
//创建装有n+1个容器的容器,该容器所装容器的初始值为n+1个0;
for(int i = n-1; i > 0; i--)
{
for(int j = i+1; j <=n; j++)
{
int ans = INT_MAX; //无穷大
for(int k = i; k <j; k++)
ans = min(ans, k + max(dp[i][k-1], dp[k+1][j]));
dp[i][j] = ans;
}
}
return dp[1][n];
}
};
另一种方法
class Solution {
public:
int DFS(vector<vector<int>> &dp, int left, int right)
{
if(left >= right) return 0;
if(dp[left][right]) return dp[left][right];
int ans = INT_MAX;
for(int i = left; i <= right; i++)
ans = min(ans, i + max(DFS(dp, left, i-1), DFS(dp, i+1, right)));
return dp[left][right]=ans;
}
int getMoneyAmount(int n) {
if(n ==0) return 0;
vector<vector<int>> dp(n+1, vector<int>(n+1, 0));
return DFS(dp, 1, n);
}
};