首页 > 编程语言 >(算法)猜数字⼤⼩II————<暴搜->记忆化搜索->动态规划>

(算法)猜数字⼤⼩II————<暴搜->记忆化搜索->动态规划>

时间:2024-08-13 23:23:55浏览次数:14  
标签:head right return int dfs II 算法 搜索 left

1. 题⽬链接:375.猜数字⼤⼩II

2. 题⽬描述:

3. 解法(暴搜->记忆化搜索):

算法思路:

暴搜:

a. 递归含义:给dfs ⼀个使命,给他⼀个区间[left, right] ,返回在这个区间上能完胜 的最⼩费⽤; b. 函数体:选择[left, right] 区间上的任意⼀个数作为头结点,然后递归分析左右⼦树。 求出所有情况下的最⼩值;

c. 递归出⼝:当left >= right 的时候,直接返回0 。

记忆化搜索:

a. 加上⼀个备忘录;

b. 每次进⼊递归的时候,去备忘录⾥⾯看看;

c. 每次返回的时候,将结果加⼊到备忘录⾥⾯。 

C++算法代码: 

class Solution 
{
public:
    int dp[201][201];
    //返回以该位置为头结点所需的金额
    int dfs(int left,int right)
    {
        if(left>=right)
        {
            return 0;
        }
        if(dp[left][right])
        {
            return dp[left][right];
        }
        dp[left][right]=INT_MAX;
        //选择头结点
        for(int head=left;head<=right;head++)
        {
            //左节点
            int x=dfs(left,head-1);
            //右节点
            int y=dfs(head+1,right);
            //取其中最大值,然后加上自身的值
            dp[left][right]=min(dp[left][right],head+max(x,y));
        }
        return dp[left][right];
    } 
    int getMoneyAmount(int n) 
    {
        return dfs(1,n);
    }
};

Java算法代码:

class Solution
{
	int[][] memo;
	public int getMoneyAmount(int n)
	{
		memo = new int[n + 1][n + 1];
		return dfs(1, n);
	}
	public int dfs(int left, int right)
	{
		if (left >= right) return 0;

		if (memo[left][right] != 0)
		{
			return memo[left][right];
		}
		int ret = Integer.MAX_VALUE;
		for (int head = left; head <= right; head++)
		{
			int x = dfs(left, head - 1);
			int y = dfs(head + 1, right);
			ret = Math.min(Math.max(x, y) + head, ret);
		}
		memo[left][right] = ret;
		return ret;
	}
}

标签:head,right,return,int,dfs,II,算法,搜索,left
From: https://blog.csdn.net/2301_79580018/article/details/141176415

相关文章

  • (算法)最⻓递增⼦序列————<暴搜->记忆化搜索->动态规划>
    1.题⽬链接:300.最⻓递增⼦序列2.题⽬描述:3.解法(暴搜->记忆化搜索->动态规划):算法思路:暴搜:a.递归含义:给dfs⼀个使命,给他⼀个数i,返回以i位置为起点的最⻓递增⼦序列的⻓度;b.函数体:遍历i后⾯的所有位置,看看谁能加到i这个元素的后⾯。统计所有情况下的最⼤值。......
  • 代码随想录算法训练营第二十八天 | 122.买卖股票的最佳时机II , 55. 跳跃游戏 , 45.跳跃
    目录122.买卖股票的最佳时机II 思路方法一:贪心方法二:动态规划55.跳跃游戏思路方法一:使用while循环方法二:使用for循环45.跳跃游戏II 思路方法一方法二方法一:贪心方法一方法二:贪心方法二 方法三:贪心方法三心得体会1005.K次取反后最大化的数组和思路方法......
  • 数学:素性测试算法
    算法简介对一个数的素性测试有很多种做法,有确定性测试的算法,也有概率性测试的算法。确定性素性测试算法确定性素性测试这里介绍两种:线性筛法:利用线性筛在\(O(n)\)的时间复杂度内,将一个范围内的数素性全部求出,然后\(O(1)\)查询。试除法:在\(\sqrt{n}\)内试商,判定是否......
  • 代码随想录算法训练营第十四天(一)| 226.翻转二叉树 101. 对称二叉树
    226.翻转二叉树题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在 [0,100] 内-100<=......
  • Java数组06:常见排序算法
    1.冒泡排序冒泡排序(BubbleSort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完......
  • Vue3如何使用v-model写一个多条件联合搜索
    在Vue3中,使用v-model进行多条件联合搜索通常涉及到绑定多个输入字段到组件的数据属性上,并在搜索逻辑中根据这些属性的值来过滤数据。虽然v-model本身是针对单个表单元素进行双向数据绑定的,但你可以通过结合使用多个v-model和计算属性或方法来处理多条件搜索。以下是一个简单......
  • 字符串算法
    KMP算法前言update2024.7.31今天重写了一篇KMP板子,之前是蒟蒻(现在也是),写的都是什么鬼,甚至没过模板题。感觉KMP优化没什么用,但是暂时保留吧。简介用模式串匹配文本串(主串)。对于一个模式串,找出每个位置的border(最长相等的前缀后缀),即为\(next\)数组。失陪时就跳到bord......
  • 最短路算法
    存在最短路的前提不存在负环。链接还是OIWiki好啊~~Floyd算法两两间最短路,可判负环。时间复杂度\(O(n^3)\)。像DP的思路一样。设\(f_{k,x,y}\)表示允许经过\(1\simk\)的点,\(x\toy\)的最短距离。\(O(n^3)\)的DP即可。按照\(k,x,y\)的顺序循环,每次与\(......
  • Python实现PID算法
    目录1.PID算法简介2.PID控制器的数学表达式3.Python实现PID算法场景:温度控制4.代码解释5.场景说明6.总结1.PID算法简介PID算法(Proportional-Integral-DerivativeControl)是经典的控制算法之一,广泛应用于自动控制系统中。PID控制器通过调节控制对象的输入,来实现对......
  • Python实现基因遗传算法
    目录基因遗传算法简介基因遗传算法的基本步骤Python实现基因遗传算法场景:优化二次函数Python代码实现代码解释场景说明总结基因遗传算法简介基因遗传算法(GeneticAlgorithm,GA)是一种基于自然选择和遗传学原理的优化算法,适用于求解复杂的组合优化问题。它通过模拟......