375. 猜数字大小 II (区间dp)

d p [ i ] [ j ] dp[i][j] dp[i][j]在范围 [ i , j ] [i,j] [i,j]获胜的最小现金数。

转移方程: d p [ i ] [ j ] = x + m a x ( d p [ i ] [ x − 1 ] , d p [ x + 1 ] [ j ] ) dp[i][j]=x+max(dp[i][x-1],dp[x+1][j]) dp[i][j]=x+max(dp[i][x1],dp[x+1][j])

因为求最小: d p [ i ] [ j ] = m i n ( x + m a x ( d p [ i ] [ x − 1 ] , d p [ x + 1 ] [ j ] ) ) , x ∈ [ i , j ) dp[i][j]=min(x+max(dp[i][x-1],dp[x+1][j])),x\in[i,j) dp[i][j]=min(x+max(dp[i][x1],dp[x+1][j])),x[i,j)

时间复杂度: O ( n 3 ) O(n^3) O(n3)

class Solution {
public:
    int getMoneyAmount(int n) {
        vector<vector<int>> f(n+1,vector<int>(n+1));
        for (int i = n - 1; i >= 1; i--) {
            for (int j = i + 1; j <= n; j++) {
                int minCost = INT_MAX;
                for (int k = i; k < j; k++) {
                    int cost = k + max(f[i][k - 1], f[k + 1][j]);
                    minCost = min(minCost, cost);
                }
                f[i][j] = minCost;
            }
        }
        return f[1][n];

    }
};