动态规划篇-04:完全平方数

news2024/11/18 3:25:22

279、完全平方数

状态转移方程

base case

当n = 0 时,和为n的完全平方数的最少数量为0.

明确状态

 “原问题或子问题中变化的变量”

在本题中,状态是 “完全平方数的最少数量”。因为当我们选择不同的完全平方数的时候,所需完全平方数的数量会改变

确定选择

“导致“状态”产生变化的行为”

在本题中,“选择”是 选用的完全平方数。

定义dp函数

dp(n) :和为n的完全平方数的最少数量。


这样我们就可以写出状态转移方程:

dp(n) = dp(n - i*i) + 1;

这里使用的还是 [分解问题] 的思路,将问题 ”和为n所需完全平方数的数量“转化为”和为 (n-i*i) 所需完全平方数的数量 “


暴力解法

class Solution {
    public int numSquares(int n) {
        return dp(n);
    }

    private int dp(int n) {
        //base case
        if (n == 0) {
            return 0;
        }
    
        int res = Integer.MAX_VALUE;
        for (int i = 1; i * i <= n; i++) {
            //状态转移方程
            //使用min是因为题目要求“最少”
            res = Math.min(res, dp(n - i * i) + 1);
        }
    
        return res;
    }

}

这时候我们再联系上动态规划篇-00:解题思想与框架中提到的解题框架:

是不是一模一样?都是遍历所有选择,每一个选择都会导致状态的改变。然后根据题意选择最优解

使用了备忘录的自上而下的递归解法

class Solution {
    public int numSquares(int n) {
        // 创建一个数组用于保存已计算过的中间结果
        int[] memo = new int[n + 1];
        Arrays.fill(memo, -1);
    
        return dp(n, memo);
    }

    private int dp(int n, int[] memo) {
        //base case
        if (n == 0) {
            return 0;
        }
    
        // 如果已经计算过,直接返回保存的结果
        if (memo[n] != -1) {
            return memo[n];
        }
    
        int res = Integer.MAX_VALUE;
        for (int i = 1; i * i <= n; i++) {
            res = Math.min(res, dp(n - i * i, memo) + 1);
        }
    
        // 将计算结果保存到数组中
        memo[n] = res;
    
        return res;
    }
}

 使用了dp数组的自下而上的迭代解法

class Solution {
   public int numSquares(int n) {
       int[] dp = new int[n + 1];
       Arrays.fill(dp, Integer.MAX_VALUE);
        //base case
       dp[0] = 0;
    
       for (int i = 1; i <= n; i++) {
           for (int j = 1; j * j <= i; j++) {
               dp[i] = Math.min(dp[i], dp[i - j*j] + 1);
           }
       }
    
       return dp[n];
    }
}

如果文章中又看不懂的地方或者文章表述有误,请务必在评论区留言。收获反馈对我很重要

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1385082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

两个Mesh路由、一个5口交换机,打造智能家居无缝网络覆盖

在现代家庭中&#xff0c;无线网络已经成为了必需品&#xff0c;每个人都希望享受到无缝连接的畅快体验。然而&#xff0c;由于信号覆盖范围的限制和信号干扰等问题&#xff0c;很多家庭在组网方面遇到了一些困难。 对于有需求的家庭而言&#xff0c;两个Mesh路由器是一种非常…

错误处理(基于ESP-IDF)

主要参考资料 B站Up主孤独的二进制《错误处理 - 乐鑫 ESP32 物联网开发框架 ESP-IDF 开发入门》 ESP-IDF编程指南>API指南>错误消息: https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1/esp32s3/api-guides/error-handling.html ESP-IDF编程指南>API指南>严…

Python - 深夜数据结构与算法之 BloomFilter

目录 一.引言 二.BloomFilter 简介 1.Hash Table 2.Bloom Filter 3.Bloom 示意图 4.Bloom 应用 三.Bloom Filter 实现 1.Python 实现 2.Python 测试 四.总结 一.引言 布隆过滤器 BloomFilter 是位运算在工业级场景应用的典范&#xff0c;其通过 bit 位保存元素是否存…

Linux/Traverxec

Enumeration nmap 使用nmap快速扫描目标&#xff0c;发现对外开放了22和80&#xff0c;第一个问题就是问80端口运行的是什么服务&#xff0c;针对这两个端口扫描对应的详细信息后就能得到答案 Nostromo 从nmap的扫描结果可以看到&#xff0c;目标开启了80端口&#xff0c;且…

MATLAB对话框与菜单设计实验

本文MATLAB源码&#xff0c;下载后直接打开运行即可[点击跳转下载]-附实验报告https://download.csdn.net/download/Coin_Collecter/88740733 一、实验目的 1.掌握建立控件对象的方法。 2.掌握对话框设计方法。 3.掌握菜单设计方法。 二、实验内容 建立如下图所示的菜单。菜单…

基于鸿蒙HarmonyOS 元服务开发一款公司运营应用(ArkTS API 9)

前言 最近基于Harmony OS最新版本开发了一个作品&#xff0c;本文来详细讲解一下&#xff0c;如何我是如何开发这个作品的。以及如何使用OpenHarmony&#xff0c;基于ArkTS&#xff0c;API 9来开发一个属于自己的元服务。 废话不多说&#xff0c;我的作品名称叫做Company Oper…

如何通过Burp Suite专业版构建CSRF PoC

Burp Suite是一款强大的渗透测试利器&#xff0c;可以利用它来高效的执行渗透攻击&#xff0c;接下来介绍如何通过Burp Suite Pro来构建CSRF PoC。 在Bupr中找到拦截的请求&#xff0c;右键选择Engagement tools > Generate CSRF PoC 利用CSRF PoC生成器自动生成HTML <h…

2.2 物理层

2.2 物理层 2.2.1 物理层的基本概念 1、物理层主要解决在各种传输媒体上传输比特0和1的问题&#xff0c;进而给数据链路层提供透明传输比特流的服务 2、由于传输媒体的种类太多&#xff08;例如同轴电缆、光纤、无线电波等&#xff09;&#xff0c;物理连接方式也有很多例如…

K8S--Ingress的作用

原文网址&#xff1a;K8S--Ingress的作用-CSDN博客 简介 本文介绍K8S的Ingress的作用。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题&#xff0c;吊打面试官&#xff1a; Java后端真实面试题…

redis数据结构源码分析——跳表zset

文章目录 跳表的基本思想特点节点与结构跳跃表节点zskiplistNode属性 跳跃表链表属性 跳表的设计思想和优势API解析zslCreate&#xff08;创建跳跃表&#xff09;zslCreateNode&#xff08;创建节点&#xff09;zslGetRank&#xff08;查找排位&#xff09;zslDelete&#xff0…

【RPC】序列化:对象怎么在网络中传输?

今天来聊下RPC框架中的序列化。在不同的场景下合理地选择序列化方式&#xff0c;对提升RPC框架整体的稳定性和性能是至关重要的。 一、为什么需要序列化&#xff1f; 首先&#xff0c;我们得知道什么是序列化与反序列化。 网络传输的数据必须是二进制数据&#xff0c;但调用…

2019年认证杯SPSSPRO杯数学建模D题(第一阶段)5G时代引发的道路规划革命全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 5G下十字路口车辆通行效率的讨论和建模 D题 5G时代引发的道路规划革命 原题再现&#xff1a; 忙着回家或上班的司机们都知道交通堵塞既浪费时间又浪费燃料&#xff0c;甚至有的时候会带来情绪上的巨大影响&#xff0c;引发一系列的交通问题。…

图像的初识

一、图像的数组表示 RGB能够构成人眼所能识别的所有颜色。 二、图像的变换 Example&#xff1a; img.shape Out[329]: (512, 768, 3) img.dtype Out[330]: dtype(uint8) #补值变换 shift_temp_img [255,255,255] - img shift_img Image.fromarray(shift_temp_img.astype(ui…

【REST2SQL】09 给Go的可执行文件exe加图标和版本信息等

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…

关于2024年3月10日PMP考试的常见问题解答

2024年第一场PMP考试3月10日&#xff08;星期日&#xff09;举行&#xff0c;目前报名正在进行中。请参加了这次考试或者计划在2024年尽早取证的伙伴们抓紧报名&#xff0c;本次报名截止到1月18日。 说句题外话&#xff0c;PMP的考试安排越来越随性了&#xff0c;哈&#xff0…

MyBatis 入门指南:基本配置和使用

ORM——对象关系映射 O:对应的是java中的对象&#xff0c;一般是pojo&#xff08;实体类&#xff09; R:关系型数据库 M:映射,指java中对象映射到数据库表中对应的记录&#xff0c;或者是数据库表中对应记录映射成java中的对象 一个mybaties程序 1、添加依赖 <parent&g…

STM32存储左右互搏 SPI总线FATS读写FRAM MB85RS2M

STM32存储左右互搏 SPI总线FATS读写FRAM MB85RS2M 在中低容量存储领域&#xff0c;除了FLASH的使用&#xff0c;&#xff0c;还有铁电存储器FRAM的使用&#xff0c;相对于FLASH&#xff0c;FRAM写操作时不需要预擦除&#xff0c;所以执行写操作时可以达到更高的速度&#xff0…

大数据Doris(五十五):SQL函数之日期函数(三)

文章目录 SQL函数之日期函数(三) 一、SECOND(DATETIME date)

Python画球面投影图

天文学研究中&#xff0c;有时候需要画的并不是传统的XYZ坐标系&#xff0c;而是需要画一个形如这样子的球面投影图&#xff1a; 下面讲一下这种图怎么画 1. 首先要安装healpy包 pip install healpy 2. 然后导入包 如果之前安装过healpy&#xff0c;有的会提示不存在healpy…

将 RGB 转换为十六进制、生成随机十六进制

RGB与十六进制 RGB&#xff08;Red, Green, Blue&#xff09;和十六进制是两种常用的颜色表示方式。 RGB是一种加法混色模式&#xff0c;它通过调节红、绿、蓝三个颜色通道的亮度来混合出各种颜色。对于每个颜色通道&#xff0c;取值范围是0到255&#xff0c;0表示该通道对应…