数据结构学习 jz14剪绳子

关键词:数学 动态规划 快速幂

这道题其实是分为两题。

题目一:

这道题我是没有思路的,看了k神的答案才知道有数学的方法。

方法一:

数学:其实中间的推导我没看,我服了。

思路:

复杂度计算:

时间复杂度O(1)

空间复杂度O(1)

代码:

看了k神的答案自己写的

class Solution {
public:
    int cuttingBamboo(int bamboo_len) {
        if(bamboo_len<=3) return bamboo_len-1;
        int a=bamboo_len/3 ,b=bamboo_len%3;
        if(b==0) return pow(3,a);
        if(b==1) return pow(3,a-1)*4;
        return pow(3,a)*2;
    }
};

方法二:

动态规划。

是我在看官方题解里面得到的思路。但比数学方法慢很多。

思路:

dp状态:

dp[i]如果竹子长为i,砍竹子可以得到的最大乘积结果。

复习知识点:

无后效性:dp[i]只与前面的dp结果有关,不与前面dp求得的过程有关。

最优子结构:dp[i]可以由dp[0...i-1]推出。

 转移方程:

dp[i]=max(dp[1..i-1]*dp[i-1...1])

即dp[i]必须要被砍成两半,但是这两半要怎么选,要一个一个试过才知道(第二个for循环)。

比如:i==6。砍的方法有dp[5]*dp[1]、dp[4]*dp[2]、dp[3]*dp[3],前面的dp已经算出了他们的最优值,拿他们的乘积比较即可。

初始化:

这个dp初始化是为了后面的dp专门设计的

        dp[0]=0;//0
        dp[1]=1;//1
        dp[2]=2;//2
        dp[3]=3;//3

复杂度计算:

时间复杂度O(n*n)

空间复杂度O(n)

代码:

这里我在第二个for循环减少了一半开销。因为dp[5]*dp[1]和dp[1]*dp[5]一样的。

class Solution {
public:
    int cuttingBamboo(int bamboo_len) {
        if(bamboo_len<=3) return bamboo_len-1;
        vector<int> dp(bamboo_len+1);
        dp[0]=0;//0
        dp[1]=1;//1
        dp[2]=2;//2
        dp[3]=3;//3
        for(int i=4;i<=bamboo_len;++i)//时间复杂度O(n*n)
        {
            for(int j=1;j<=i/2+i%2;++j)//只用找一半
            {
                dp[i]=max(dp[i],dp[i-j]*dp[j]);
            }
        }
        return dp[bamboo_len];
    }
};

题目二:

数学、快速幂

这道题和第一题的区别就是长度的范围扩大了,如果用数学法,用stl里的pow求3为底的结果会爆炸,所以需要快速幂来取模。

思路:

第一题的数学+快速幂+求模 

复杂度计算:

时间复杂度O(logn) 快速幂

空间复杂度O(1)

代码:

class Solution {
public:
    int MOD=1000000007;
    long long my_pow(int a,int n)
    {
        long long res=1;
        long long rex=a;
        while(n)
        {
            if(n&1)
            {
                res=res*rex%MOD;
            }
            rex=rex*rex%MOD;
            n=n>>1;
        }
        return res;
    }
    int cuttingBamboo(int bamboo_len) {
        if(bamboo_len<=3) return bamboo_len-1;
        
        int a=bamboo_len/3,b=bamboo_len%3;
        long long res;
        if(b==0) 
        {
            res = my_pow(3,a);
            return res;
        }
        
        if(b==1) 
        {
            res = my_pow(3,a-1);
            res=res*4%MOD;
            return res;
        }
        res = my_pow(3,a);
        res=res*2%MOD;
        return res;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matplotlib:热图、箱形图、小提琴图、堆叠面积图、雷达图、子图

简介&#xff1a;在数字化的世界里&#xff0c;从Web、HTTP到App&#xff0c;数据无处不在。但如何将这些复杂的数据转化为直观、易懂的信息&#xff1f;本文将介绍六种数据可视化方法&#xff0c;帮助你更好地理解和呈现数据。 热图 (Heatmap)&#xff1a;热图能有效展示用户…

WorkPlus企业内部即时通信新选择,打造高效协作新格局

在企业内部&#xff0c;快速、高效的沟通与协作是推动工作进程的关键。而即时通信工具成为了企业内部沟通的重要工具。作为一款优秀的企业内部即时通信工具&#xff0c;WorkPlus通过其出色的性能和独特的功能&#xff0c;为企业打造高效协作的新格局。 为什么选择WorkPlus作为企…

详解Matlab深度学习进行波形分割

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

强化学习应用(三):基于Q-learning算法的无人车配送路径规划(提供Python代码)

一、Q-learning算法介绍 Q-learning是一种强化学习算法&#xff0c;用于解决基于环境的决策问题。它通过学习一个Q-table来指导智能体在不同状态下采取最优动作。下面是Q-learning算法的基本步骤&#xff1a; 1. 定义环境&#xff1a;确定问题的状态和动作空间&#xff0c;并…

逆变器之推挽谐振

首先把前级推挽电路分成几个模块&#xff1a;方波发生器、谐振LC、整流滤波以及负载。框图如下图所示&#xff1a; 分析前提&#xff1a;稳态 在推挽电路正常工作中&#xff0c;输入电压恒定、输出电流电压也恒定&#xff08;电源处于稳定的工作状态中&#xff09; 方波发生器…

Objective-C使用UISwitch控制UITextField显示明文或密文

1.xib中设计 2.关联控件 3.使用代码控制开关与TextField显示模式 4.开关控件UISwitch点击事件实现,点击时根据状态切换TextField显示模式 5.显示效果:

【Qt】QThread moveTothread-多线程的两种实现方法

一、如何理解多线程 二、实现多线程的两种方式&#xff08;面向应用&#xff09; 2.1 继承 QThread 的类 2.2 (推荐这种方式)函数 moveTothread() 三、多线程的释放问题&#xff08;善后工作&#xff09; 多线程的两种实现方法 一、如何理解多线程二、实现多线程的两种方式&…

文件操作(二)

͟͟͞͞&#x1f3c0;前言上一篇我们加们讲了什么是文件&#xff0c;为什么使用文件&#xff0c;以及流的概念。我们继续接上一篇来继续讲解我们的文件操作&#xff0c;这一篇将会详细的讲如何对文件进行读写。 目录 &#x1f680;一.文件的顺序读写 1.fgetc和fputc 2.fget…

oracle—IMU机制

正常的情况下&#xff0c;当事务需要回滚块的时候&#xff0c;是去undo表空间找 现在是在sharepool中分一个IMUbuffer&#xff0c;将所有的回滚信息写入。直接就可以从中取。减少了物理IO 同时这个过程也产生redo&#xff0c;直接就是图中红色的&#xff0c;不防止崩溃 优点 1…

Java21 + SpringBoot3集成WebSocket

文章目录 前言相关技术简介什么是WebSocketWebSocket的原理WebSocket与HTTP协议的关系WebSocket优点WebSocket应用场景 实现方式1. 添加maven依赖2. 添加WebSocket配置类&#xff0c;定义ServerEndpointExporter Bean3. 定义WebSocket Endpoint4. 前端创建WebSocket对象 总结 前…

Java 树形结构数据生成导出excel文件V2

** >> 相对于V1版本&#xff0c;优化了代码逻辑&#xff0c;合理使用递归计算树数据的坐标 << ** 1、效果 2、使用方法 import com.alibaba.fastjson.JSONArray; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Workboo…

Shiro框架:Shiro登录认证流程源码解析

目录 1.用户登录认证流程 1.1 生成认证Token 1.2 用户登录认证 1.2.1 SecurityManager login流程解析 1.2.1.1 authenticate方法进行登录认证 1.2.1.1.1 单Realm认证 1.2.1.2 认证通过后创建登录用户对象 1.2.1.2.1 复制SubjectContext 1.2.1.2.2 对subjectContext设…

【如何在 GitHub上面找项目】【转载】

很多的小伙伴&#xff0c;经常会有这样的困惑&#xff0c;我看了很多技术的学习文档、书籍、甚至视频&#xff0c;我想动手实践&#xff0c;于是我打开了GitHub&#xff0c;想找个开源项目&#xff0c;进行学习&#xff0c;获取项目实战经验。这个时候很多小伙伴就会面临这样的…

【数据结构 | 直接选择排序】

直接选择排序 基本思路直接插入排序SelectSort 基本思路 直接插入排序&#xff08;StraightInsertionSort&#xff09;的基本操作是将一个记录插入到已经排好序的有序表中&#xff0c;从而得到一个新的、记录数增1的有序表。 我们可以同时从数组的头部和尾部同时进行排序工作…

Pandoc:markdown转word

简介&#xff1a;Pandoc是由John MacFarlane开发的标记语言转换工具&#xff0c;可实现不同标记语言间的格式转换&#xff0c;堪称该领域中的“瑞士军刀”。Pandoc使用Haskell语言编写&#xff0c;以命令行形式实现与用户的交互&#xff0c;可支持多种操作系统&#xff1b;Pand…

IP-Adapter:用于文本到图像扩散模型的文本兼容图像提示适配器

文章目录 一、IP-Adapter简介二、IP-Adapter与img2img的区分&#xff08;一&#xff09;结构上的区别&#xff08;二&#xff09;流程上的区别&#xff08;三&#xff09;输出上的区别&#xff08;四&#xff09;原理上的区别 三、IP-Adapter的网络架构&#xff08;一&#xff…

自定义C#类库(.dll文件)

环境配置 操作系统&#xff1a;Windows 10 开发工具&#xff1a;Visual Studio 2022 .Net桌面开发环境&#xff1a; 开发步骤 &#xff08;一&#xff09;创建C#类库项目 &#xff08;二&#xff09;配置项目名称和项目路径 &#xff08;三&#xff09;选择所使用的框架&a…

ES数据聚合

1.数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f; 这些手机的平均价格、最高价格、最低价格&#xff1f; 这些手机每月的销售情况如何&#xff1f; 实现这些…

PDF 文档解除密码

PDF 文档解除密码 1. 文件 -> 文档属性 -> 安全 -> 文档限制摘要2. PDF365References 1. 文件 -> 文档属性 -> 安全 -> 文档限制摘要 密码保护《算法设计与分析基础_第3版.pdf》 2. PDF365 https://www.pdf365.cn/ 免费功能 -> PDF 去密码 开始去除 Re…

PVE虚拟机配置文件恢复

一、pve 创建的虚拟机的配置文件位置 在宿主机的 /etc/pve/qemu-server&#xff0c;这里有创建虚拟机的相关硬件信息。 rootpve1:/etc/pve/qemu-server# pwd /etc/pve/qemu-server二、故障现象 在命令行执行qm list不显示虚拟机&#xff0c;查看 宿主机的 /etc/pve/qemu-ser…