剪绳子的几种解法 — C++实现
文章目录
- 题目描述
- 动态规划求解
- 求解代码
- 贪心法求解
- 求解代码
题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
牛客网题目链接
动态规划求解
我们定义函数 f ( n ) f(n) f(n)为把长度为n
的绳子剪成若干段后乘积的最大值
则 f ( n ) = m a x ( f ( i ) − f ( n − i ) ) f(n)=max(f(i)-f(n-i)) f(n)=max(f(i)−f(n−i)):
- 把长度为
n
的绳子剪为长度为i
和长度为n-i
的两端,然后再求子问题 f ( i ) f(i) f(i)和 f ( n − i ) f(n-i) f(n−i)(i=1,2,...,n-1
)
即:一个问题可以分解为子问题,要使得该问题最优,则子问题先要实现最优,因此我们可以使用动态规划的思路去求解
原问题从上到下使用递归法求解,动态规划的核心是填表,先求解子问题,然后自下而上求解,最终得到原问题的解
求解代码
class Solution {public:int cutRope(int number) {if(number<4)return number;else{int *tab =new int[number+1];//表格数组int i,j;//以下为填表过程tab[0]=0;tab[1]=1;tab[2]=2;tab[3]=3;for(i=4;i<=number;i++){tab[i]=0;for(j=1;j<=i/2;j++){if(tab[i]<tab[j]*tab[i-j])tab[i]=tab[j]*tab[i-j];}}return tab[number];//表中最后一个即为所求}}
};
运行时间:3ms占用内存:608k
贪心法求解
尽可能地剪出长度为3
的子段,但当最后一段所剩长度为4
时,将其剪为2*2
的两段落,因为2*2 > 3*1
PS:关于为何剪为3
的子段的数学证明博主还没有想到如何用通俗易懂的方式讲解(可参考《剑指Offer》),欢迎大佬留言指教
求解代码
class Solution {public:int cutRope(int number) {if(number<5)return number;if(number%3==1)return pow(3,number/3-1)*4;elsereturn pow(3,number/3)*pow(2,(number%3)/2);}
};
运行时间:3ms占用内存:608k
剪绳子的几种解法 — C++实现相关推荐
- 【剑指Offer】剪绳子问题——四种解法
剪绳子问题--四种解法 题目描述: 输入描述: 返回值描述: 示例1: 解题思路: 方法1:暴力递归 方法2:记忆化递归 方法三:动态规划 方法四,数学原理 题目描述: 给你一根长度为n的绳子,请把绳 ...
- 剑指 Offer 14- I. 剪绳子(5种方案)
https://leetcode-cn.com/problems/jian-sheng-zi-lcof/ 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m ...
- 剪绳子 算法_[校招-算法题]动态规划
动态规划(Dynamic Programming)是面试中非常常见的一种算法,可以解决很多复杂问题. 核心算法: 定义状态:dp[i],一个数组,具体几维根据问题定. 状态转移方程:dp[i] = b ...
- 动态规划-剪绳子问题
题目 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],-,k[m-1].请问k[0]×k[1]×-×k[m]可能 ...
- 剪绳子(动态规划、贪心算法)
一.前言 <剑指Offer>中题14 二.题目 给你一根长度为n的绳子,请把绳子剪成m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[ ...
- 【算法】【动态规划篇】第5节:剪绳子问题
本期任务:介绍算法中关于动态规划思想的几个经典问题 [算法][动态规划篇]第1节:0-1背包问题 [算法][动态规划篇]第2节:数字矩阵问题 [算法][动态规划篇]第3节:数字三角形问题 [算法][动 ...
- NOJ——1672剪绳子(博弈)
[1672] 剪绳子 时间限制: 500 ms 内存限制: 65535 K 问题描述 已知长度为n的线圈,两人依次截取1~m的长度,n, m为整数,不能取者为输. 输入 输入n, m:( 0 < ...
- LeetCode-剑指 Offer 14- I. 剪绳子
思路一:动态规划 1:首先我们想要求长度为n的绳子剪掉后的最大乘积,可以从前面比n小的绳子转移而来 2:用一个dp数组记录从0到n长度的绳子剪掉后的最大乘积,也就是dp[i]表时长度为i的绳子剪成m段 ...
- 剑指 Offer 14.剪绳子(动态规划、数学分析)
一.题目内容 二.题目分析 这道题目讲道理,我看到的第一眼就是动态规划,但是后来提交之后,发现还有大佬考虑用数学分析得出精简解法,在这里我也会一 一阐述. 对于动态规划而言,按照老套路,首先定义dp数 ...
最新文章
- 【舒工强烈推荐】命令添加Git远程仓库
- LeetCode-剑指 Offer 13. 机器人的运动范围
- 可视化神器背后的奥秘
- laravel redis_Redis 之服务器集群配置
- Excel里,vlookup函数各种应用-匹配多列、多条件匹配
- stream iterators源代码详解
- go语言ATM小案例
- 西门子S7-1200控制伺服/步进电机方法与接线(全)
- 魔兽世界稳定服务器,魔兽世界美服服务器趋于稳定 排队新技术将实装
- 火箭双杀尼克斯 哈林组合和砍50分
- 用户态和内核态的切换耗费时间的原因
- 2022全新直播短视频系统源码+附教程/可二开可采集
- 数据预处理:分类和顺序变量转化为数值型数据
- 《途客圈创业记:不疯魔,不成活》一一2.4 与iWeekend再续前缘
- Adroid游戏开发实例讲解(五)-哄娃神器之随机五彩泡(附源码)
- 【Unity】Unity 2D游戏开发(三)2D游戏常用功能及插件
- 详解ArcGIS (Pro)面积制表(区域制表)参数设置及报错处理
- 蓝桥杯赛前真题 Python组 Day 4
- 群晖NAS用迅雷远程下载Xware 1.xxx的进程监视和掉线自动重启
- PS2手柄模控制ESP32控制舵机 ArduinoPWM控制