【LeetCode343】剪绳子(动态规划)
一、题目
二、思路
(1)确定状态
dp[i]
是将正整数i
拆成2个及其以上的正整数后,求所有数的乘积值。
(2)状态转移方程
当 i≥2 时,假设对正整数 i 拆分出的第一个正整数是 j(1≤j<i),则有以下两种方案:
1)将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j×(i−j);
2)将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j×dp[i−j]。
因此,当 j 固定时,有 d p [ i ] = m a x ( j × ( i − j ) , j × d p [ i − j ] ) dp[i]=max(j×(i−j),j×dp[i−j]) dp[i]=max(j×(i−j),j×dp[i−j])由于 j 的取值范围是 1 到 i−1,需要遍历所有的 j 得到 dp[i] 的最大值,因此可以得到状态转移方程如下: d p [ i ] = max 1 ≤ j < i ( j × ( i − j ) , j × d p [ i − j ] ) d p[i]=\max _{1 \leq j<i}(j \times(i-j), j \times d p[i-j]) dp[i]=1≤j<imax(j×(i−j),j×dp[i−j])
最终得到 dp[n] 的值即为将正整数 n 拆分成至少两个正整数的和之后,这些正整数的最大乘积。
(3)边界+初始条件
边界条件: 0 不是正整数,1 是最小的正整数,0 和 1 都不能拆分,因此 dp[0]=dp[1]=0。
(4)计算顺序
从小到大。
三、C++代码
class Solution {public:int cuttingRope(int n) {vector<int>dp(n + 1);for(int i = 2; i <= n; i++){for(int j = 1; j < i; j++){dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));}}return dp[n];}
};
【LeetCode343】剪绳子(动态规划)相关推荐
- 剑指Offer:剪绳子(动态规划、贪婪算法)
问题描述 给你一根长度为n的绳子,请把绳子剪成m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],-,k[m].请问k[0]xk[1]x-xk[m]可能的最大乘 ...
- 88. Leetcode 剑指 Offer 14- I. 剪绳子 (动态规划-基础题)
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] .请问 k[0]*k[1]*... ...
- 【LeetCode笔记】剑指 Offer 14. 剪绳子 I II(Java、动态规划、偏数学)
文章目录 剪绳子 I 题目描述 思路 && 代码 1. 动态规划 O(n2n^2n2).O(n) 2. 最优解:数学方法 O(n).O(1) 二刷 剪绳子 II 题目描述 思路 &am ...
- 剪绳子 算法_[校招-算法题]动态规划
动态规划(Dynamic Programming)是面试中非常常见的一种算法,可以解决很多复杂问题. 核心算法: 定义状态:dp[i],一个数组,具体几维根据问题定. 状态转移方程:dp[i] = b ...
- 剑指 Offer 14.剪绳子(动态规划、数学分析)
一.题目内容 二.题目分析 这道题目讲道理,我看到的第一眼就是动态规划,但是后来提交之后,发现还有大佬考虑用数学分析得出精简解法,在这里我也会一 一阐述. 对于动态规划而言,按照老套路,首先定义dp数 ...
- 动态规划-剪绳子问题
题目 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],-,k[m-1].请问k[0]×k[1]×-×k[m]可能 ...
- 【算法】【动态规划篇】第5节:剪绳子问题
本期任务:介绍算法中关于动态规划思想的几个经典问题 [算法][动态规划篇]第1节:0-1背包问题 [算法][动态规划篇]第2节:数字矩阵问题 [算法][动态规划篇]第3节:数字三角形问题 [算法][动 ...
- 剪绳子(动态规划和贪婪算法)
题目: 把长度为n的绳子剪成m段(n>1,m>1),每段绳子的长度记为k[1],...k[m],则每段绳子的长度的最大乘积是多少?例如身子长度为8时,剪成2,3,3三段得到的乘积最大,为1 ...
- 12、剪绳子——剑指offer——动态规划
剪绳子 问题描述:给你一根长度为n的绳子,请把绳子剪成m段(m和n都是整数,n>1并且m>1), 每段绳子的长度记为k[0],k[1],...,k[m]. 请问k[0]*k[1]*...* ...
- 动态规划贪婪算法之剪绳子
动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决. 1. 可以使用动态规划的情形: (1)在应用动态规划之前,要分析能否把大问题分解成小问 ...
最新文章
- select报错 spark_使用spark-sql报错 “Metastore contains multiple versions”
- Java常用类(5)--不可变的任意精度BigInteger、BigDecimal类
- 两个excel文档查找相同选项后替换_看似普通的查找和替换功能,用好了,能让你的工作效率翻一番...
- clickhouse 查询优化_查询提升200倍,ClickHouse你值得拥有!
- ESP定律手工脱壳步骤
- Oracle JET Model 数据获取与使用
- Mybatis自动去重
- H5实现点击图片放大功能
- [Windows批处理]清除IE缓存
- 使用PS旋转单个图层
- 康托尔定理是怎样证明的?
- 一个VC编写的虚拟桌面软件
- [thrift] thrift基本原理及使用
- 汇编语言:8421 BCD码加减法的修正问题
- java基础—综合练习
- java ctor_vue-test-utils设置获取TypeError:无法在字符串上创建属性'_Ctor'
- 学3D建模要注意什么问题?入行好几年,踩过的坑后的经验
- Java如何从键盘中进行输入
- 我将进化成一条狗(3)——区块链
- 【报错】date: invalid date ‘2 days ago+%Y%m%d‘