数据结构学习 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;//0dp[1]=1;//1dp[2]=2;//2dp[3]=3;//3for(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.mzph.cn/news/622052.shtml

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

相关文章

逆变器之推挽谐振

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

C-操作符详解

1.进制转换 1.1 10进制转2进制 方法&#xff1a;短除法 1.2 2进制转换8进制 8进制的数字每⼀位是0~7的&#xff0c;0~7的数字&#xff0c;各⾃写成2进制&#xff0c;最多有3个2进制位就⾜够了&#xff0c;⽐如7的⼆进制是111&#xff0c;所以在2进制转8进制数的时候&#xf…

SQL语句详解一

概念 什么是 SQL&#xff1f;&#xff08;如果还未安装MySQL请参考此文章安装下&#xff09; Structured Query Language&#xff1a;结构化查询语言其实就是定义和操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方&#xff0c;称为"方言"。 SQ…

C语言常用库函数

1.C语言标准库函数 C语言标准库函数由15个头文件组成。 1.数学函数 数学计算是计算机最擅长的运算&#xff0c;计算机大部分运算方法都是基于数学计算执行的。C语言提供了很多用于数学计算的库函数&#xff0c;合理利用这些库函数&#xff0c;将对程序的编写和运行起到事半功…

Socket通讯使用的坑-消息合并发送-解决方法

关联文章 Socket通讯使用的坑-消息合并发送-CSDN博客 解决方法 /// <summary> /// 公共方法 /// </summary> public static class CommonMethods {/// <summary>/// 多个JSON对象字符串转成JSON字符串列表/// </summary>/// <param name"j…

点云深度图像创建(DepthImage)

目录 一、相关介绍 二、生成深度图像方法 三、实现代码 四、运行结果

初始化网络的权重和偏置的方法有哪些?

在神经网络中&#xff0c;权重和偏置的初始化对模型的训练和最终性能有重要影响。一个好的初始化方法可以帮助加速梯度下降的收敛速度&#xff0c;减少训练时间&#xff0c;甚至有助于避免训练过程中的问题&#xff0c;比如梯度消失或梯度爆炸。下面是一些常用的权重和偏置初始…

第9章-第2节-Java中的反射机制

1、概念&#xff1a; 反射机制&#xff1a;是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意属性和方法&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为 java…

Python:pickle 模块详解

pickle 模块是 Python 中用于序列化和反序列化对象的标准模块。它可以将对象转换为字节流&#xff0c;以便将其保存到文件或通过网络传输&#xff0c;然后再将字节流还原为原始对象。以下是 pickle 模块的常用函数、示例以及一些注意事项&#xff1a; pickle.dump() 函数&…

ModuleNotFoundError: No module named ‘wtforms.ext‘

flask运行报错&#xff1a; ModuleNotFoundError: No module named wtforms.ext 解决办法&#xff1a; python -m pip install WTForms2.3.3参考&#xff1a; superset 安装及连接clickhouse可视化_superset clickhouse-CSDN博客

Python每日一练-DAY03

Question 3 题目 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和 解题思路一 题目分析: 这道题目要求我们计算一个分数序列的前20项之和。 这个分数序列中,每一项的分子是前两项的分子之和,分母是前两项的分母之和。 例如,第三项的分子为2+3=5…

e2studio开发三轴加速度计LIS2DW12(4)----测量倾斜度

e2studio开发三轴加速度计LIS2DW12.4--测量倾斜度 概述视频教学样品申请源码下载计算倾斜角度工作原理单轴倾斜检测双轴倾斜检测三轴倾斜检测通信模式管脚定义IIC通信模式速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e…

分析美方推动零信任战略的网络安全创新规律(下)

分析美方推动零信任战略的网络安全创新规律(下) 文章目录 分析美方推动零信任战略的网络安全创新规律(下)前言一、零信任理念产生的成因和创新价值(一)零信任是在传统IT边界消亡时对安全边界的重塑(二)零信任是对原有安全能力体系的重新整合(三)零信任创新的价值在于…

Ubuntu共享文件到win

Ubuntu共享文件到win 1、安装samba sudo apt-get install samba samba-common2、创建一个共享文件夹&#xff0c;并设置777权限 mkdir /home/qyh/share sudo chmod 777 /home/qyh/share我的用户名&#xff1a;qyh。 3、添加用户及密码 sudo smbpasswd -a qyh4、修改配置文…

阿里云大数据ACA及ACP复习题(121~140)

121.数据清洗(Data Cleaning)是用于检测和纠正&#xff08;或删除&#xff09;记录集&#xff0c;表或数据库中的不准确或损坏的记录。下列选项中&#xff0c;对数据清洗描述正确的是(ABC) A:数据清洗可以检测表中的不准确或损坏的记录 B:数据清洗可以识别不正确&#xff0c;不…

多进程实现案例

多进程 多进程&#xff08;简单程序&#xff09; from multiprocessing import Process, Queueclass MyProcess(Process):def __init__(self, q, i):super().__init__()self.q qself.i idef run(self):print(子进程%s 开始put数据 % self.i)self.q.put(我是%s 通过Queue通信…

ssh远程访问及控制

目录 一、ssh协议简介 1、实现远程访问的协议和程序 2、ssh协议的概念及功能 3、ssh协议的工作原理 3.1 对称加密与非对称加密 3.1.1 对称加密&#xff08;Symmetric Encryption&#xff09; 3.1.2 非对称加密&#xff08;Asymmetric Encryption&#xff09; 3.2 公钥传…

C //练习 5-3 用指针方式实现第2章中的函数strcat。函数strcat(s, t)将t指向的字符串复制到s指向的字符串的尾部。

C程序设计语言 &#xff08;第二版&#xff09; 练习 5-3 练习 5-3 用指针方式实现第2章中的函数strcat。函数strcat(s, t)将t指向的字符串复制到s指向的字符串的尾部。 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下&#xff0c;有部分可能需要变更。…

表对象的标识

表对象标识 kingbase中表作为数据库对象具有一个系统内部的唯一标识符&#xff0c;这个标识符被称为oid&#xff08;对象标识符&#xff09;&#xff0c;它是kingbase用来在整个数据集群中唯一地标识每个数据库对象的一个字段。对于表来说&#xff0c;其OID可以在系统目录表sy…

Pandoc:markdown转word

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