剑指offer----C语言版----第九天

news2024/12/29 1:16:30

目录

1. 剪绳子

1.1 题目描述

1.2 基础知识 

1.2.1 动态规划

1.2.2 贪婪算法

1.3 思路一:动态规划

1.4 思路二:贪婪算法

1.5 思路一的优化


1. 剪绳子

原题链接:
剑指 Offer 14- I. 剪绳子 - 力扣(LeetCode)https://leetcode.cn/problems/jian-sheng-zi-lcof/

1.1 题目描述

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

1.2 基础知识 

1.2.1 动态规划

如果题目中是求一个问题的最优解(通常是最大值和最小值),而且该问题能够分解成若干个子问题,并且子问题之间还有重叠的更小的子问题,就可以考虑用动态规划来解决这个问题。

应用动态规划求解问题的特点1:能够把大问题分解成小问题并且分解后的小问题也存在最优解。

例如在本题中,我们不妨把长度为n的绳子剪成若干段后得到的乘积的最大值定义为函数f(n)。假设我们第一次剪在长度为i的位置,于是绳子变成了i和n-i两段。我们想要求到该题的最优解f(n),那么同样要用最优化的方法把长度为i和n-i的两段剪成若干段,使得他们各自剪出的每段绳子的长度乘积最大。

于是我们便得到了应用动态规划求解问题的特点2:整体问题的最优解是依赖于各个子问题的最优解。

应用动态规划求解问题的特点3:我们把大问题分解成若干个小问题,这些小问题之间还有互相重叠的更小的子问题。假设绳子的初始长度为10,我们可以把绳子剪成4和6的两段,也就是f(4)和f(6)都是f(10)的子问题。接下来分别求解这两个子问题.我们把长度为4 的绳子剪成长度均为2的两段,即f(2)是f(4)的子问题。相似地,我们可以把长度为6的绳子剪成长度分别为2和4的两段,即f(2)和f(4)都是f(6)的子问题。于是我们便可以发现f(2)是f(4)和f(6)公共的子问题。

由于子问题在分解大问题的过程中重复出现,为了避免重复求解子问题,我们采用从下往上的顺序先计算小问题的最优解并储存下来,再以此为基础求取大问题的最优解。从上往下分析问题,从下往上求解问题,这便是应用动态规划求解问题的特点4。我们通常把已经解决的子问题的最优解存储在一维或二维数组中,并且把子问题的最优解组合起来逐步解决大问题。

在运用动态规划的时候,我们每一步都可能面临若干个选择。例如在求解本题时,剪第一刀有n-1个选择。由于我们不知道剪在哪个位置才是最优解,只能把所有能剪的位置(1到n-1)尝试一遍。

1.2.2 贪婪算法

贪婪算法与动态规划不同。我们应用贪婪算法解决问题时,每一步都可以做一个贪婪的选择,基于这个选择我们能够确定最优解。对于本题这个贪婪的选择就是3(解题时证明),当绳子的长度大于等于4时,则每次剪出一段长度为3 的绳子,以此类推,直到剩余绳子长度小于3 。为什么这样的贪婪选择能够的到最优解?这便需要数学的方式来证明贪婪选择是正确的。

1.3 思路一:动态规划

对于长度为n的绳子,同样假设绳子剪成若干段后得到的乘积的最大值定义为函数f(n),我们在其长度为i(1<i<n)的地方剪第一刀时,得到长度为i和长度为n-i的两段绳子。对于长度为n-i的绳子我们有两种选择:

选择一:对长度为n-i的绳子不继续往下剪,于是得到长度乘积:i * (n - i)。

选择二:对长度为n-i的绳子继续往下剪,于是得到长度乘积:i * f(n - i)。

接下来便可得到f(n) = max[ i * (n - i), i * f(n - i) ],i = 1, 2, 3, ....... , n - 1。

同样地我们不知道那里才是最优解,所以需要将i = 1,到i = n - 1 都尝试一遍。

该解题方法时间复杂度O(N*N),空间复杂度O(N)。

int cuttingRope(int n){
    //开辟空间存储结果
    int* ret = (int*)calloc(sizeof(int), n+1);
    int i,j;
    //题目要求至少剪一次所以从长度为2开始
    for(i=2;i<=n;i++)
    {
        int max = 0;
        //这里的i对应思路中的n,自下向上求解问题,从子问题的求解过程中逐步解决长度为n的结果
        for(j=1;j<i;j++)
        {
            //不清楚哪一次求得最优解,所以要将上一次的结果参与最大值的选择。
            max = fmax(max,fmax(j*(i-j),j*ret[i-j]));
        }
        //求得最优解之后将结果保存到一维数组
        ret[i] = max;
    }
    return ret[n];
}

1.4 思路二:贪婪算法

因为我们的贪婪选择是3,而题目要求至少剪一次,故当n<=3时不可用该方法计算,直接返回即可:

n = 3,最优解:2

n = 2,最优解:1

n = 1,最优解:0

该解题方法时间复杂度O(1),空间复杂度O(1)。

int cuttingRope(int n){
    if(n<=3)
    {
        return n-1;
    }
    int times = n / 3;
    int mod = n % 3;
    if(mod == 0)
    {
        return (int)pow(3,times);
    }
    else if(mod == 1)
    {
        return (int)pow(3,times-1)*2*2;
    }
    else
    {
        return (int)pow(3,times)*2;
    }

}

1.5 思路一的优化

有了贪婪算法,我们就可以对思路一进行优化啦,将绳子剪成3段是贪婪选择,所以当我们用此公式来计算最优解时f(n) = max[ i * (n - i), i * f(n - i) ],i = 1, 2, 3, ....... , n - 1。i >=4 就不需要计算啦,因为贪婪选择是3嘛,至于i = 1时,就更好想了,肯定不是最优解。

所以公式可以进行化简:f(n) = max{ max[ 2* (n - 2), 2 * f(n - 2) ], max[ 3 * (n - 3), 3 * f(n - 3) ] }。

该解题方法的时间复杂度为O(N),空间复杂度为O(n)。

int cuttingRope(int n)
{
    int* ret = (int*)calloc(sizeof(int), n+1);
    ret[2] = 1;
    int i=0;
    for(i=3;i<=n;i++)
    {
        int max = fmax(fmax(2*(i-2), 2*ret[i-2]), fmax(3*(i-3),3*ret[i-3]));
        ret[i]=max;
    }
    return ret[n];
}

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

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

相关文章

无约束优化:Hessian-Free Optimization 拟牛顿类算法(BFGS,L-BFGS)

文章目录无约束优化&#xff1a;Hessian-Free Optimization 拟牛顿类算法&#xff08;BFGS&#xff0c;L-BFGS&#xff09;为什么要用拟牛顿算法割线方程严格凸且光滑函数的BFGS算法非凸但光滑函数的BFGS算法L-BFGS算法非凸非光滑函数的BFGS算法参考文献无约束优化&#xff1a;…

LInux僵尸进程的解决方法

文章目录僵尸进程是如何出现的&#xff1f;如何防止僵尸进程产生&#xff1f;使用wait函数使用waitpid函数阻塞等待非阻塞等待——轮询僵尸进程出现后如何解决&#xff1f;僵尸进程是如何出现的&#xff1f; 一个进程在退出后&#xff0c;操作系统会释放该进程对应的资源&…

网络舆情监测管理制度及处置机制,网络舆情监测服务项目实时方案?

舆情监测通常包括搜集、分析和报告舆论信息的过程。搜集信息的途径包括网络新闻、社交媒体、博客、论坛等&#xff0c;分析信息的方法包括自然语言处理、数据挖掘、模糊属性决策分析等。接下来TOOM舆情监测小编带您简单了解网络舆情监测管理制度及处置机制&#xff0c;网络舆情…

奈奎斯特采样定理(Nyquist)

采样定理在1928年由美国电信工程师H.奈奎斯特首先提出来的&#xff0c;因此称为奈奎斯特采样定理。1933年由苏联工程师科捷利尼科夫首次用公式严格地表述这一定理&#xff0c;因此在苏联文献中称为科捷利尼科夫采样定理。1948年信息论的创始人C.E.香农对这一定理加以明确地说明…

VirtualBox+Vagrant快速搭建linux虚拟环境

VirtualBoxVagrant快速搭建linux虚拟环境 1.下载安装VirtualBox 下载 Virtual Box 官网: https://www.virtualbox.org/ 2.BIOS 里修改设置开启虚拟化设备支持(f2, f10) 参考: https://jingyan.baidu.com/article/ab0b56305f2882c15afa7dda.html 3.安装 Virtual Box&#xff…

【自学Python】Windows Python交互式运行

Windows Python交互式运行 Windows Python交互式运行教程 安装好 Python 之后&#xff0c;Python 都会提供一个 Python 命令行工具&#xff0c;就叫 python。 python 命令行工具不仅能用于运行 Python 程序&#xff0c;也可作为一个交互式解释器&#xff0c;即开发者可以在该…

9种 分布式ID生成方式

一、为什么要用分布式ID&#xff1f; 在说分布式ID的具体实现之前&#xff0c;我们来简单分析一下为什么用分布式ID&#xff1f;分布式ID应该满足哪些特征&#xff1f; 1、什么是分布式ID&#xff1f; 拿MySQL数据库举个栗子&#xff1a; 在我们业务数据量不大的时候&#…

AcWing算法提高课:区间DP

两种实现方式 循环式 一般对于一维的DP问题可以应用。 for(len 1; len < n; len)for(l 1; l len-1 < n; l)r l len - 1;//枚举方案数记忆化搜索式 一般在二维DP中使用 循环也倒是可以&#xff0c;但是层数太多&#xff0c;所以使用记忆化进行实现。 常见策略 …

深入解读Netty 底层核心源码,全面分析Netty特新

前言 Netty 是一款基于 NIO&#xff08;非阻塞 I/O&#xff09;开发的网络框架&#xff0c;与传统 BIO 相比&#xff0c;它的并发性能得到了很大的提高&#xff0c;而且更加节省资源。Netty 不仅封装了 NIO 操作的很多细节&#xff1b;在设计上还基于灵活、可扩展的事件驱动模…

java学习day68(乐友商城)RabbitMQ及数据同步

今日目标&#xff1a; 了解常见的MQ产品 了解RabbitMQ的5种消息模型 会使用Spring AMQP 利用MQ实现搜索和静态页的数据同步 1.RabbitMQ 1.1.搜索与商品服务的问题 目前我们已经完成了商品详情和搜索系统的开发。我们思考一下&#xff0c;是否存在问题&#xff1f; 商品的…

Qt样式(qss)的几套配色方案

背景&#xff1a;之前写过有关qss的博客&#xff0c;记录了如何使用qt手册&#xff0c;以及在项目中如何使用qss的体验。经过实践&#xff0c;我归纳了自己需要的qss使用方法&#xff0c;使之尽量高效&#xff0c;容易维护。Qt样式&#xff08;qss&#xff09;手册小结&#xf…

工业数字孪生技术在钢铁企业中的应用展示

目前随着网络技术的发展&#xff0c;数字孪生技术已逐步应用于智慧工厂、智慧城市等领域。钢铁生产作为典型的工业流程制造场景&#xff0c;具备工艺复杂、物料交叉、生产节奏紧凑等特点。借助数字孪生技术仿真、虚实融合等能力&#xff0c;对钢铁生产过程的各个环节进行指导与…

SpringBoot+VUE前后端分离项目学习笔记 - 【14 SpringBoot和Vue实现用户登录】

前端代码 Login.vue 注意&#xff1a;el-form必须写 :model 否则无法使用表单校验功能 <el-form-item> 不能少 <template><div class"wrapper"><div style"margin: 200px auto; background-color: #fff; width: 350px; height: 300px; pa…

魔兽世界私服架设 服务器架设简易教程

今天早晨明杰终于把魔兽世界的私服搭建成功可以运行了。挺happy。记录一下搭建的全过程&#xff1a;1.先下载私服服务器端&#xff1a;从mangoscn.com下载大芒果ftp://www.mangoscn.com/TCCN-3.2.2-Trinity5749.exe从这个地址下载不需要注册&#xff0c;如果从mangoscn.com的网…

Python+Yolov5反光衣黄色马甲特征识别监测快速锁定目标人物体

程序示例精选 PythonYolov5反光衣识别 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 Yolov5比较Yolov4,Yolov3等其他识别框架&#xff0c;速度快&#xff0c;代码结构简单&#xff0c;识别效率高&#xff0…

计算机网络进阶 ---- MGRE ---- NHRP ---- 详解

一、MGRE&#xff08;多点GRE&#xff09;&#xff1a; 属于 NBMA 网络类型&#xff1b;在所有要连通的网络之间仅需要构建一个MA网段即可&#xff1b;且仅可以存在一个 固定的 IP地址&#xff0c;看作中心站点&#xff1b;其他分支站点可以是动态的 IP地址&#xff0c;节省成…

从recat源码角度看setState流程

setState setState() 将对组件 state 的更改排入队列批量推迟更新&#xff0c;并通知 React 需要使用更新后的 state 重新渲染此组件及其子组件。其实setState实际上不是异步&#xff0c;只是代码执行顺序不同&#xff0c;有了异步的感觉。 使用方法 setState(stateChange | u…

助力生产质量检验,基于YOLOV5实现香烟质量缺陷检测

生产质量环境的检验始终是一个热门的应用场景&#xff0c;在之前一些项目和文章中我也做过一些相关的事情&#xff0c;比如PCB电路板相关的&#xff0c;如下&#xff1a;《助力质量生产&#xff0c;基于目标检测模型MobileNetV2-YOLOv3-Lite实现PCB电路板缺陷检测》本质的目的就…

含泪赔了近200万,我终于明白不是什么人都能干电商的……

文|螳螂观察 作者|图霖 又是一年年货节&#xff0c;围绕电商相关话题的讨论正在增多。 都说现在入行做电商十有九亏&#xff0c;但《螳螂观察》注意到一组数据&#xff1a;截至7月31日&#xff0c;过去一年入淘创业者的数量仍在增长&#xff0c;淘宝天猫净增了近120万商家&a…

每天五分钟机器学习:如何使用误差分析来构造最优的异常检测算法

本文重点 在异常检测算法中,我们要做的事情之一就是使用正态(高斯)分布来对特征向量进行建模p(xi;μi,σi),所以输入到算法中的特征变量很重要。 特征变量不符合高斯分布怎么办 首先我们需要知道一点,有些特征变量的数据并不符合高斯分布,但是我们假设它们符合高斯分…