IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 剑指offer_剪绳子(C++_动态规划/图解贪心算法) -> 正文阅读

[数据结构与算法]剑指offer_剪绳子(C++_动态规划/图解贪心算法)

原题链接

在这里插入图片描述

动态规划

1.思路

可以分析出来,因为题目要求必须剪。当绳子的长度小于2的时候不能剪了,这里返回0。当长度为2时只能1×1,乘积为1。当长度为3时最大乘积为1×2=2。

当长度>3时假设长度为n,在剪第一刀时有n-1种情况
假设一刀将绳子剪为i长与n-i长,乘积最大为F(n)=F(i)*F(n-i)
这个式子为一个递归式,其中有大量的重复计算。
所以我们从下往上开始记录,定义一个数组Cout,数组的下标值对应的是绳子的长度,下标对应的值为绳子在是下标长度时的最大乘积(最优解)。
所以F(n)=F(i)*F(n-i)可以写为max(Cout[i]*Cout[n-i])

2.动态规划C++代码

class Solution {
public:
    int cutRope(int number) {
        if(number<2)
            return 0;
        if(number==2)
            return 1;
        if(number==3)
            return 2;
        int* cout=new int[number+1];//多存放number=0情况
        cout[0]=0;
        cout[1]=1;
        cout[2]=2;
        cout[3]=3;
        for(int i=4;i<=number;i++)
        {
            int max=0;
            for(int j=1;j<=i/2;j++)//循环找最大乘积值
            {
                if(max<cout[j]*cout[i-j])
                {
                    max=cout[j]*cout[i-j];
                }
            }
            cout[i]=max;
        }
        return cout[number];
    }
};

3.代码注意

为什么当绳子长度<2时乘积为0,这里cout数组cout[0]=0,cout[1]=1

解:
能运行到cout数组这里说明其长度一定大于3
这里cout[1]=1不是说长度为1的绳子最大乘积为1,而是指如果剪后出现长度为1的绳子就不剪了。同理cout[3]表明当剪后出现长度为3的绳子就不剪了,如果再剪成1和2乘积为2<3就不是最优解了。
eg:长度为4的绳子先计算的为cout[1]×cout[3]相当于剪成了长度为1和长度为3的绳子对应数组下标的乘积值为1×3=3。

贪心算法

1.思路

同理:因为题目要求必须剪。当绳子的长度小于2的时候不能剪了,这里返回0。当长度为2时只能1×1,乘积为1。当长度为3时最大乘积为1×2=2。当绳子长度为4时最大乘积为2×2=4

当绳子长度>=5时

①证明一

我们发现当剪下的两条绳子长度的乘积大于等于其本身才有剪的意义
即i×(n-i)>=n(其中n>=5)
在这里插入图片描述
由上面可知我们要尽量选择剪出长度为2或者3的绳子,可以使最后的乘积最大,优先剪出长度为3的绳子。

②证明二

在绳子长度>=时5我们剪绳子最优解为:
一段长度为i与n-i的乘积要大于等于(i-1)与(n-i+1)同时还要大于等于(i+1)与(n-i-1)的乘积,即剪掉长度i是最优解

在这里插入图片描述

2.C++贪心算法代码

class Solution {
public:
    int cutRope(int number) {
        if(number<2)
            return 0;
        if(number==2)
            return 1;
        if(number==3)
            return 2;
        int CoutPow3=number/3;//计算可以切出几个长度为3的绳子
        if(number-3*CoutPow3==1)
    //如果切到最后长度为4,单独处理长度为4的绳子,切成2*2,最大乘积为4
        {
            CoutPow3--;
            return pow(3,CoutPow3)*4;
        }
        if(number-3*CoutPow3==2)
     //切到最后长度为2,这时不需要再切了长度为2
        {
            return pow(3,CoutPow3)*2;
        }
     //正好可以切成整数个长度为3的绳子
        return pow(3,CoutPow3);
    }
};

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 12:11:23  更:2021-09-30 12:11:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 14:38:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码