动态规划 剪绳子问题

给一段长度为n的绳子,请把绳子剪成m段,每段绳子的长度为k[0],k[1],k[2],k[3]....k[m].请问k[0]k[1]k[2].....*k[m]的最大乘积为多少

#include <vector> // 包含vector头文件
#include <algorithm> // 包含algorithm头文件,用于max函数

class Solution { // 定义解决方案类
public:
    int cutRope(int n) { // 主函数,计算最大乘积
        if (n <= 1) return 0; // 如果绳子长度小于等于1,无法剪断
        if (n == 2) return 1; // 如果绳子长度为2,最大乘积为1
        if (n == 3) return 2; // 如果绳子长度为3,最大乘积为2
        
        std::vector<int> dp(n + 1, 0); // 创建动态规划数组,初始化为0
        
        // 初始化基础情况
        dp[0] = 0; // 长度为0的绳子乘积为0
        dp[1] = 1; // 长度为1的绳子乘积为1
        dp[2] = 2; // 长度为2的绳子乘积为2
        dp[3] = 3; // 长度为3的绳子乘积为3
        
        for (int i = 4; i <= n; i++) { // 从长度4开始计算
            for (int j = 1; j <= i / 2; j++) { // 尝试所有可能的切割点
                dp[i] = std::max(dp[i], dp[j] * dp[i - j]); // 更新最大乘积
            }
        }
        
        return dp[n]; // 返回长度为n的绳子的最大乘积
    }
};

这个实现使用了动态规划的方法来解决问题。以下是主要的设计思路:

  1. 我们定义了一个Solution类,其中包含一个cutRope函数来解决这个问题。
  2. 首先,我们处理了一些特殊情况:
    • 如果绳子长度小于等于1,无法剪断,返回0。
    • 如果绳子长度为2,最大乘积为1(必须剪断)。
    • 如果绳子长度为3,最大乘积为2(必须剪断)。
  3. 我们创建了一个动态规划数组dp,其中dp[i]表示长度为i的绳子能得到的最大乘积。
  4. 初始化基础情况:
    • dp[0] = 0dp[1] = 1dp[2] = 2dp[3] = 3
    • 注意,对于长度为2和3的情况,虽然必须剪断,但在作为子问题时,保持完整可能会得到更大的乘积。
  5. 然后,我们从长度4开始,逐步计算到长度n:
    • 对于每个长度i,我们尝试所有可能的切割点j。
    • 计算dp[j] * dp[i-j],这代表将绳子切割成长度为j和i-j的两段。
    • 使用std::max函数来更新dp[i],保证它始终是最大的乘积。
  6. 最后,返回dp[n],即为所求的最大乘积。

这个算法的时间复杂度为O(n^2),空间复杂度为O(n)。

当然可以使用更有效的解法,但是需要一点数学知识这个优化的算法基于一个数学发现:当绳子长度大于3时,尽可能多地切出长度为3的片段会得到最大乘积。如果最后剩下的长度为1,我们应该将其与一个3合并,形成一个长度为4的片段

class Solution { // 定义解决方案类
public:
    int cutRope(int n) { // 主函数,计算最大乘积
        if (n <= 3) return n - 1; // 处理特殊情况
        
        int quotient = n / 3; // 计算可以切出多少个长度为3的片段
        int remainder = n % 3; // 计算切完长度为3的片段后剩余的长度
        
        if (remainder == 0) { // 如果刚好被3整除
            return pow(3, quotient); // 返回3的quotient次方
        } else if (remainder == 1) { // 如果余1
            return pow(3, quotient - 1) * 4; // 最后的3和1合并为4
        } else { // 如果余2
            return pow(3, quotient) * 2; // 最后剩一个2
        }
    }
    
private:
    int pow(int base, int exponent) { // 快速幂函数
        int result = 1; // 初始化结果为1
        while (exponent > 0) { // 当指数大于0时循环
            if (exponent & 1) { // 如果指数的二进制表示中当前位为1
                result *= base; // 将base乘到结果中
            }
            base *= base; // base自乘
            exponent >>= 1; // 指数右移一位
        }
        return result; // 返回结果
    }
};

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

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

相关文章

Swagger php注解常用语法梳理

Swagger php注解常用语法梳理 快速编写你的 RESTFUL API 接口文档工具&#xff0c;通过注释定义接口和模型&#xff0c;可以和代码文件放置一起&#xff0c;也可以单独文件存放。 Swagger 优势 通过代码注解定义文档&#xff0c;更容易保持代码文档的一致性模型复用&#xff0…

Spring Boot中使用SpringEvent组件

Spring的事件机制是基于观察者模式的实现&#xff0c;主要由以下三个部分组成&#xff1a; 事件&#xff08;Event&#xff09;&#xff1a;事件是应用中发生的重要事情&#xff0c;通常是一个继承自ApplicationEvent的类。 事件发布器&#xff08;Publisher&#xff09;&…

ubuntu使用官方deb文件安装指定版本cuda失败,总是装成最新版

之前安装过最新版的cuda&#xff0c;之后想换用旧版&#xff0c;但是按照官网的说明&#xff0c;sudo apt-get -y install cuda后总是装成最新版的。 解决方法&#xff1a; 最后一步使用sudo apt-get -y install cuda-x-x&#xff0c;直接指定你要安装的cuda的版本号。

python作业一

1. #A. num int(input("请输入要打印的层数:")) for n in range(1, num1):s ""for i in range(1, n1):s f"{i}" " "print(s)#B. num int(input("请输入要打印的层数:")) for i in range(num1, 0, -1):s" "f…

springcloud+vue项目,controller层接口返回json数据,前端可以接收到数据,但浏览器“F12-->网络-->响应“显示为空的问题处理

1.显示为空的场景 SharetekR(access_tokeneyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJQQzoxODA1ODA4ODc1MjUwMTIyNzUyIiwicm5TdHIiOiJrZEoxV05CV3NBSUdYb05TbktSU3kzOGNuSnk3c3FRTSIsInVzZXJJZCI6MTgwNTgwODg3NTI1MDEyMjc1MiwidXNlck5h…

分布式数据库HBase:从零开始了解列式存储

在接触过大量的传统关系型数据库后你可能会有一些新的问题: 无法整理成表格的海量数据该如何储存? 在数据非常稀疏的情况下也必须将数据存储成关系型数据库吗? 除了关系型数据库我们是否还有别的选择以应对Web2.0时代的海量数据? 如果你也曾经想到过这些问题, 那么HBase将是…

25届最近5年华北电力大学自动化考研院校分析

华北电力大学&#xff08;北京保定&#xff09; 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、初试大纲复试大纲 七、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指…

【C语言】刷题笔记 Day2

【笔记】 【1】局部变量不初始化&#xff0c;默认放的随机值。 1 int n0; 2 scanf("%d",&n); //13.141 【2】这里虽然输入的是一个浮点数&#xff0c;但是只取整数部分。 【3】3.156e7 表示的是3.156*10的7次方。 【4】多组输入&#xff0c;保存和不保存…

关于Wav2Lip配置实现

模型介绍 Wav2Lip是一种先进的深度学习模型&#xff0c;旨在将音频波形直接转换为面部动画&#xff0c;尤其关注于唇部动作的生成与同步。这一技术的核心在于其能够利用输入的语音信号&#xff0c;生成与之高度匹配的嘴唇动作&#xff0c;从而实现逼真的语音驱动数字人物动画效…

docker初始化运行mysql容器时自动导入数据库存储过程问题

问题&#xff1a;用navicat导出的数据库脚本&#xff0c;在docker初始化运行mysql容器时&#xff0c;导入到存储过程时出错。 ERROR 1064 (42000) at line 2452: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for t…

DataWhale-吃瓜教程学习笔记 (六)

学习视频**&#xff1a;第4章-决策树_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 第五章 5.1&#xff1b;5.2&#xff1b;5.3 文章目录 MP 神经元- 感知机模型 &#xff08;分类模型&#xff09;-- 损失函数定义--- 感知机学习算法 - 随机梯度下降法 - 神经网络需要解决的问…

2024年显著性检测部分论文及代码汇总(3)

ICML Size-invariance Matters: Rethinking Metrics and Losses for Imbalanced Multi-object Salient Object Detection code Abstacrt&#xff1a;本文探讨了显著性检测中评价指标的尺寸不变性&#xff0c;尤其是当图像中存在多个大小不同的目标时。作者观察到&#xff0c;…

解决Python爬虫开发中的数据输出问题:确保正确生成CSV文件

引言 在大数据时代&#xff0c;爬虫技术成为获取和分析网络数据的重要工具。然而&#xff0c;许多开发者在使用Python编写爬虫时&#xff0c;常常遇到数据输出问题&#xff0c;尤其是在生成CSV文件时出错。本文将详细介绍如何解决这些问题&#xff0c;并提供使用代理IP和多线程…

开始尝试从0写一个项目--前端(一)

基础项目构建 创建VUE初始工程 确保自己下载了node.js和npm node -v //查看node.js的版本 npm -v //查看npm的版本 npm i vue/cli -g //安装VUE CLI 创建 以管理员身份运行 输入&#xff1a;vue ui 就会进入 点击创建 自定义项目名字&#xff0c;选择npm管理 结…

C++ 智能指针内存泄漏问题

shared_ptr相互嵌套导致循环引用 代码示例 #include <iostream> #include <memory> using namespace std;class B;class A { public:std::shared_ptr<B> b_ptr;~A() { std::cout << "A destroyed\n"; } };class B { public:std::shared_pt…

【前端项目笔记】8 订单管理

订单管理 效果展示&#xff1a; 在开发功能之前先创建分支order cls 清屏 git branch 查看所有分支&#xff08;*代表当前分支&#xff09; git checkout -b order 新建分支order git push -u origin order 将本地的当前分支提交到云端仓库origin中命名为order 通过路由方式…

014-GeoGebra基础篇-快速解决滑动条的角度无法输入问题

有客户反馈&#xff0c;他的Geogebra一直有个bug&#xff0c;那就是输入角度最大值时总不按照他设定的展示&#xff0c;快被气炸了~ 目录 一、问题复现&#xff08;1&#xff09;插入一个滑动条&#xff08;2&#xff09;选择Angle&#xff08;3&#xff09;输入90&#xff0c;…

|从零搭建网络| VisionTransformer网络详解及搭建

&#x1f31c;|从零搭建网络| VisionTransformer系列网络详解及搭建&#x1f31b; 文章目录 &#x1f31c;|从零搭建网络| VisionTransformer系列网络详解及搭建&#x1f31b;&#x1f31c; 前言 &#x1f31b;&#x1f31c; VIT模型详解 &#x1f31b;&#x1f31c; VIT模型架…

Buuctf之不一样的flag(迷宫题)

首先&#xff0c;进行查壳无壳&#xff0c;32bit&#xff0c;丢进ida32中进行反编译进入main函数&#xff0c;对其进行分析&#xff0c;可以在一旁打上注释&#xff0c;这边最关键的一个点就是&#xff0c;需要联想到这是一个迷宫题&#xff0c;很小的迷宫题&#xff0c;迷宫就…