zoukankan      html  css  js  c++  java
  • Leetcode 375.猜数字大小II

    猜数字大小II

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

    我从 n 之间选择一个数字,你来猜我选了哪个数字。

    每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了。

    然而,当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。直到你猜到我选的数字,你才算赢得了这个游戏。

    示例:

    n = 10, 我选择了8.

    第一轮: 你猜我选择的数字是5,我会告诉你,我的数字更大一些,然后你需要支付5块。

    第二轮: 你猜是7,我告诉你,我的数字更大一些,你支付7块。

    第三轮: 你猜是9,我告诉你,我的数字更小一些,你支付9块。

    游戏结束。8 就是我选的数字。

    你最终要支付 5 + 7 + 9 = 21 块钱。

    给定 n ≥ 1,计算你至少需要拥有多少现金才能确保你能赢得这个游戏。

    解题思路:定义一个二维数组dp[i][j],表示数字在i~j之间时需要付出的最少成本,最后求dp[1][n]。我们可以在i~j之间任意取一个数k,把区间分为两段i~k-1, k+1~j;

    此时花费成本的最大值为:max_cost=k+max(dp[i][k-1], dp[k+1][j]);(考虑最坏的情况下,保证猜对的成本);遍历每一个区间,求出需要的最少成本。

     1 class Solution {
     2     public int getMoneyAmount(int n) {
     3         if(n==1) return 0;
     4         int[][] dp=new int[n+1][n+1];
     5         for(int i=2;i<=n;i++){
     6             for(int j=i-1;j>0;j--){
     7                 int globmin=Integer.MAX_VALUE;
     8                 for(int k=j+1;k<i;k++){
     9                     int maxcost=k+Math.max(dp[j][k-1],dp[k+1][i]);
    10                     globmin=Math.min(maxcost,globmin);
    11                 }
    12                 dp[j][i]=j+1==i?j:globmin;
    13             }
    14         }
    15         return dp[1][n];
    16     }
    17 }
  • 相关阅读:
    LeetCode 230. Kth Smallest Element in a BST
    LeetCode 114. Flatten Binary Tree to Linked List
    LeetCode 222. Count Complete Tree Nodes
    LeetCode 129. Sum Root to Leaf Numbers
    LeetCode 113. Path Sum II
    LeetCode 257. Binary Tree Paths
    Java Convert String & Int
    Java Annotations
    LeetCode 236. Lowest Common Ancestor of a Binary Tree
    LeetCode 235. Lowest Common Ancestor of a Binary Search Tree
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10235337.html
Copyright © 2011-2022 走看看