NO67、剪绳子(其实就是求3和4的个数)

2024-01-21 03:08
文章标签 个数 其实 绳子 no67

本文主要是介绍NO67、剪绳子(其实就是求3和4的个数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

67、剪绳子 其实就是求3和4的个数

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

输入描述:

输入一个数n,意义见题面。(2 <= n <= 60)

输出描述:

输出答案。

示例1

输入

8

输出

18
1、很厉害的一种思路
/*** 题目分析:* 先举几个例子,可以看出规律来。* 4 : 2*2* 5 : 2*3* 6 : 3*3* 7 : 2*2*3 或者4*3* 8 : 2*3*3* 9 : 3*3*3* 10:2*2*3*3 或者4*3*3* 11:2*3*3*3* 12:3*3*3*3* 13:2*2*3*3*3 或者4*3*3*3** 下面是分析:* 首先判断k[0]到k[m]可能有哪些数字,实际上只可能是2或者3。* 当然也可能有4,但是4=2*2,我们就简单些不考虑了。* 5<2*3,6<3*3,比6更大的数字我们就更不用考虑了,肯定要继续分。* 其次看2和3的数量,2的数量肯定小于3个,为什么呢?因为2*2*2<3*3,那么题目就简单了。* 直接用n除以3,根据得到的余数判断是一个2还是两个2还是没有2就行了。* 由于题目规定m>1,所以2只能是1*1,3只能是2*1,这两个特殊情况直接返回就行了。** 乘方运算的复杂度为:O(log n),用动态规划来做会耗时比较多。*/
int cutRope(int number) {if (number == 2) {return 1;}if (number == 3) {return 2;}int x = number % 3, y = number / 3;if (x == 0) {return pow(3, y);}else if (x == 1) {return 2 * 2 * pow(3, y - 1);}else return 2 * pow(3, y);}
1-1、力扣上的一种讲解

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户

内存消耗:6 MB, 在所有 C++ 提交中击败了100.00%的用户

    int cuttingRope(int n) {if(n<2) return 0;if(n<4) return n-1;int maxNum=1;while(n>4){maxNum*=3;n-=3;}maxNum*=n;return maxNum;}
2、一种DP讲解方法
讲解视频:

https://www.bilibili.com/video/BV18E411T7dU?from=search&seid=16580267998265505121

int cutRope(int number) {if (number == 2 || number == 3)return number - 1;vector<int> ans(number + 1,0);ans[0] = 1;ans[1] = 1;for (int i = 2; i <= number; ++i){ans[i] = i - 1;//分为2 段 1 * (i-1)for (int j = 2; j < i; ++j){ans[i] = max(ans[i], j * ans[i - j]); //一种是继续分割的情况ans[i] = max(ans[i], j * (i-j));//不在分割 就割成两段}}return ans[number];
}
2、这种DP更容易懂一些
讲解视频:https://www.bilibili.com/video/BV1C7411V7s6?from=search&seid=16580267998265505121

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户

内存消耗:6 MB, 在所有 C++ 提交中击败了100.00%的用户

int cutRope(int number) {if (number < 2) return -1;if (number == 2 || number == 3)return number - 1;vector<int> ans(number + 1,0);int maxNum = -1;ans[1] = 1;ans[2] = 2;ans[3] = 3;//因为长度》=4,他们不需要拆,拆了反而会变小,对于小于4的情况我们直接开头处理for (int i = 4; i <= number; ++i){for (int j = 1; j <= i/2; ++j){maxNum = max(maxNum, ans[j] * ans[i - j]);ans[i] = maxNum;}}return ans[number];
}

j<=i/2 是因为 f(5) = f(1)*f(4) f(5) = f(2)*****f(3) f(5) = f(3)*****f(2)

f(5) = f(4)*****f(1) ,可以看到走到后面去了有回来了,所以走一半即可,但一定要走到一半才行,不能小于i/2,必须是小于等于

二刷:

运行时间:3ms 占用内存:508k

    int cutRope(int number) {if(number <=3 ) return number - 1;vector<int> dp(number+1,0);dp[0] = 1;dp[1] = 1;dp[2] = 2;dp[3] = 3;int maxNum = -1;for(int i = 4; i<= number; ++i){for(int j = 1; j <= i/2; ++j){maxNum = max(maxNum,dp[j] * dp[i-j]);dp[i] = maxNum;}}return dp[number];}
剪绳子-2(力扣54题)

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

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

示例 1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1
示例 2:输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36提示:2 <= n <= 1000
1、DP会溢出,只能用上述规律这一种方法来做了

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户

内存消耗:6.2 MB, 在所有 C++ 提交中击败了100.00%的用户

int cuttingRope(int n) {if(n<2) return 0;if(n<4) return n-1;long maxNum=1,mod = 1000000007;while(n>4){maxNum*=3;maxNum %=mod;n-=3;}maxNum*=n;maxNum %=mod;return maxNum;}

美女帅哥们如果觉得写的还行,有点用的话麻烦点个赞或者留个言支持一下阿秀~
如果觉得狗屁不通,直接留言开喷就完事了。

**

需要该笔记PDF版本的去我的个人公众号【拓跋阿秀】下回复“阿秀剑指offer笔记”即可。

**

这篇关于NO67、剪绳子(其实就是求3和4的个数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628182

相关文章

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

O(n)时间内对[0..n^-1]之间的n个数排序

题目 如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 思路 把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 代码 #include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A,

LCP 485. 最大连续 1 的个数[lleetcode -11]

从今天起,我们的算法开始研究搜索,首先就是DFS深度优先搜索(depth-first seach,DFS)在搜索到一个新的节点时,立即对该新节点进行遍 历;因此遍历需要用先入后出的栈来实现,也可以通过与栈等价的递归来实现。对于树结构而言, 由于总是对新节点调用遍历,因此看起来是向着“深”的方向前进。 下面是一个一维的DFS算法 LCP 485. 最大连续 1 的个数 给定一个二进制数组 nu

双指针(5)_单调性_有效三角形的个数

个人主页:C++忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创 双指针(5)_单调性_有效三角形的个数 收录于专栏【经典算法练习】 本专栏旨在分享学习C++的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 题目链接: 2.题目描述 : 3.解法 :     解法一(暴力枚举) :     算法思路 :     代码展示 : 暴力枚

HDU2521(求因子个数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2521 解题思路: 数据量不大,直接O(n)遍历,对每个数求其因子个数,找出最大的即可。 完整代码: #include <functional>#include <algorithm>#include <iostream>#include <fstream>#includ

222.完全二叉树的节点个数

(写给未来遗忘的自己) 题目: 代码: class Solution {public:int countNodes(TreeNode* root) {queue<TreeNode*>node_que;if(root==nullptr) return 0;node_que.push(root);int result;while(!node_que.empty()){int layer_s

Kubernetes的alpha.kubernetes.io/nvidia-gpu无法限制GPU个数

问题描述: Pod.yaml文件中关于GPU资源的设置如下: 然而在docker中运行GPU程序时,发现宿主机上的两块GPU都在跑。甚至在yaml文件中删除关于GPU的请求,在docker中都可以运行GPU。 原因: 上例说明alpha.kubernetes.io/nvidia-gpu无效。查看yaml文件,发现该docker开启了特权模式(privileged:ture): 而

编写一个统计空格制表符与换行符个数的函数

int main(int argc, char* argv[]) {  double nc,nc1,nc2;     nc = nc1 = nc2 =0;  int c;  while((c = getchar()) != EOF)  {   if(c == '\t')    nc++;   else if(c == ' ')    nc1++;   else if(c == '\n')

用ACF和PACF计算出一堆数据的周期个数以及周期时长,数据分析python

具体步骤 1使用ACF和PACF:可以通过查看ACF图中的周期性峰值,找到数据中的周期性。如果ACF图在某个滞后期处出现显著的正相关峰值,并且这种模式在多个滞后周期中重复出现,这就是周期性信号的特征。而PACF则可以帮助确定延迟的直接影响。 2找周期数和周期长度:周期的时长可以通过ACF中第一个显著的峰值(排除滞后期为0时的峰值)来确定,而周期的个数则可以通过分析整个序列中的周期性重复次数来估计