375_猜数字大小(II)_2021.11.12

我们正在玩一个猜数游戏,游戏规则如下:

我从 1 到 n 之间选择一个数字。
你来猜我选了哪个数字。
如果你猜到正确的数字,就会 赢得游戏 。
如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。
每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。如果你花光了钱,就会 输掉游戏 。
给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字 。

 

 

 

 

 

 今天室友提供了二分法的思路,在他之上我设计了一下二分法,结果发现最优解用二分法解不出来,所以最终参考题解学习了一波动态规划,但是看动态规划我也没太看懂,有懂的小伙伴留言一起讨论:

 1 class Solution {
 2 public:
 3     int getMoneyAmount(int n) {
 4         if(n==1)
 5             return 0;
 6         //定义矩阵
 7         int dp[n+1][n+1];
 8         //初始化“\”
 9         for(int i=0;i<=n;i++){
10             for(int j=0;j<=n;j++){
11                 dp[i][j]=INT_MAX;
12             }
13         }
14         //定义基础值dp[i][i]
15         for(int i=0;i<=n;i++){
16             dp[i][i]=0;
17         }
18 
19         //按列来,从第2列开始
20         for(int j=2;j<=n;j++){
21             //按行来,从下往上
22             for(int i=j-1;i>=1;i--){
23                 //算除了两端的每一个分割点
24                 for(int k=i+1;k<=j-1;k++){
25                     dp[i][j]=min(k+max(dp[i][k-1],dp[k+1][j]),dp[i][j]);
26                 }
27                 //算两端
28                 dp[i][j]=min(dp[i][j],i+dp[i+1][j]);
29                 dp[i][j]=min(dp[i][j],j+dp[i][j-1]);
30             }
31         }
32         return dp[1][n];
33     }
34 };

 

posted @ 2021-11-12 21:11  炫迈吃到爽  阅读(96)  评论(0编辑  收藏  举报