2021-11-12 375猜数字大小

动态规划的思路,注意此题似乎没法用二分直接做,相反似乎是先猜比选择的数字大的,然后再向下寻找,最终找到选择的数字i,接着构造动态规划方程,dp[i][j]=k+Math.max(dp[i][k-1],dp[k+1][j]);
最终找出k从i到j内所有可能情况的最小值。
java版本

class Solution {
    public int getMoneyAmount(int n) {
        int[][] dp=new int[n+1][n+1];
        for(int i=n-1;i>=1;i--){
            for(int j=i+1;j<=n;j++){
                int minCost=Integer.MAX_VALUE;
            for(int k=i;k<j;k++){
               int   cost=k+Math.max(dp[i][k-1],dp[k+1][j]);
               minCost=Math.min(minCost,cost);
            
            }
           dp[i][j]=minCost;
            }
            
         }
           return dp[1][n];
 
        }

    }

Go版本

import ( "math"
"fmt")
func getMoneyAmount(n int) int {


   dp:=make([][]int,n+1)

   for i:=range dp{
       dp[i]=make([]int,n+1)
   }

    // i表示提供的数字
    // j表示每次初始猜测的数字
    // k表示猜测数字与实际数字相差的后续猜测数
//    INT_MAX:= int(^uint(0) >> 1)
   minCost:=0;


   for i:=n-1;i>=1;i--{
    for j:=i+1;j<=n;j++{
        minCost=math.MaxInt32;
        for k:=i;k<j;k++{
            cost:=k+max(dp[i][k-1],dp[k+1][j])
            minCost=min(cost,minCost);

        }
        dp[i][j]=minCost;
    }
   }
//    fmt.Println(dp)

    return dp[1][n];
}

func  min(num1 int,num2 int)int{
if num1>num2{
    return num2;
}
return num1;
}
func  max(num1 int,num2 int)int{
if num1>num2{
    return num1;
}
return num2;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,104评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 6,913评论 0 2
  • 今天上午陪老妈看病,下午健身房跑步,晚上想想今天还没有断舍离,马上做,衣架和旁边的的布衣架,一看乱乱,又想想自己是...
    影子3623253阅读 2,932评论 3 8