其他分享
首页 > 其他分享> > 375. 猜数字大小 II 力扣(中等) 区间动态规划、记忆化搜索

375. 猜数字大小 II 力扣(中等) 区间动态规划、记忆化搜索

作者:互联网

375. 猜数字大小 II

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

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

 

示例 1:

输入:n = 10
输出:16
学习要点:

记忆化搜索:dp[l][r]在循环的时候是不赋值的,一定是得到最优解之后,才赋值为dp[l][r],然后给别的子问题用。自己还不是最优,怎么让别人也最优。

区间动态规划:

题解:

代码:记忆化搜索

class Solution {
public:
    int dp[205][205];
    int dfs(int l,int r)
    {
        if (l>=r) return 0;
        if (dp[l][r]>0) return dp[l][r];
        int sum=0x7fffffff;
        for(int i=l;i<=r;i++)
            sum=min(sum,max(dfs(l,i-1),dfs(i+1,r))+i);
        
        dp[l][r]=sum;   // 是得到最优值sum才能赋值的,不能在中间得到解。
        return dp[l][r];
    }
    int getMoneyAmount(int n) {
     memset(dp,0,sizeof(dp));
     return dfs(1,n);
    }
};

 

标签:II,return,数字,猜数,int,力扣,最优,375,dp
来源: https://www.cnblogs.com/stepping/p/15546189.html