力扣375.猜数字大小 II
-
dp
-
dp[i][j]是说依次以从i到j的数字作为分割点(猜的数),必定赢的游戏所用钱的最小值。
-
枚举每一列,从下往上算出dp[i][j],最终答案为dp[1][n]
-
-
class Solution { public: int getMoneyAmount(int n) { if(n == 1) return 0; int dp[n+1][n+1]; //初始化无穷大 for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) dp[i][j] = INT_MAX; //i到i全为0 for(int i=0;i<=n;i++) dp[i][i] = 0; //从第二列开始 for(int j=2;j<=n;j++) { //从下往上 for(int i=j-1;i>=1;i--) { //枚举除了两侧以外的分割点 for(int k=i+1;k<=j-1;k++) //新的值为k+max(dp[i][k-1],dp[k+1][j]) dp[i][j] = min(k+max(dp[i][k-1],dp[k+1][j]),dp[i][j]); //求两侧的dp值 dp[i][j] = min({dp[i][j],i+dp[i+1][j],j+dp[i][j-1]}); } } return dp[1][n]; } };