当前位置:网站首页>力扣:343. 整数拆分
力扣:343. 整数拆分
2022-08-04 05:14:00 【empty__barrel】
题目:
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
思路:
首先思考这是一个动态规划的题目,那么当前值是由前面的值表示出来的,怎么表示呢?不清楚。此时就应该通过答案反推过程同时在此过程中要始终记得当前值是可以由前面的值表示的。一个值被拆分成几个值,同时有这种情况:
- dp[ n ] = 某某+dp[ i ]
- dp[ i] = 某某+dp[ i] +/-/*/÷ dp[ j ]
- 等等
此时可以联想到求dp[ i ] 有以下两种方案:
将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j * i-j
将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j * dp[ i-j ]
因此,当 j 固定时,有 dp[ i ] = max( j × ( i−j ) , j × dp[ i−j ])。
由于 j 的取值范围是 1 到 i-1,所以需要遍历所有的 j 得到 dp[ i ] 的最大值
动态规划代码:
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n+1);
dp[2] = 1;
for(int i = 3; i <= n; ++i){
for(int j = 1; j < i-1; ++j){
dp[i] = max(dp[i],max(dp[i-j]*j,(i-j)*j));
}
}
return dp[n];
}
};
贪心:
本题也可以用贪心,每次拆成n个3,如果剩下是4,则保留4,然后相乘,但是这个结论需要数学证明其合理性!
我没有证明,而是直接用了结论。感兴趣的同学可以自己再去研究研究数学证明哈。
class Solution {
public:
int integerBreak(int n) {
if (n == 2) return 1;
if (n == 3) return 2;
if (n == 4) return 4;
int result = 1;
while (n > 4) {
result *= 3;
n -= 3;
}
result *= n;
return result;
}
};
边栏推荐
- 【流程图】
- What are the functions of mall App development?
- 字节最爱问的智力题,你会几道?
- Jenkins export and import Job Pipeline
- 转:管理是对可能性的热爱,管理者要有闯进未知的勇气
- Towards Real-Time Multi-Object Tracking (JDE)
- 7-3 LVS+Keepalived Cluster Description and Deployment
- 入坑软件测试的经验与建议
- There is an 8 hour difference between the docker installation of mysql and the host.
- 2022 software test interview questions The latest ByteDance 50 real interview questions, 15k have been won after brushing, with explanation + Q&A
猜你喜欢
leetcode 12. Integer to Roman numeral
How to keep the source code confidential in the development under the burning scenario
sql server如何得到本条记录与上一条记录的差异,即变动值
入坑软件测试的经验与建议
3000 words, is take you understand machine learning!
你以为border-radius只是圆角吗?【各种角度】
败给“MySQL”的第60天,我重振旗鼓,四面拿下蚂蚁金服offer
编程大杂烩(四)
小程序 + 电商,玩转新零售
What is the salary of a software testing student?
随机推荐
Mini program + e-commerce, fun new retail
Typora 使用保姆级教程 | 看这一篇就够了 | 历史版本已被禁用
小程序 + 电商,玩转新零售
[Cocos 3.5.2]开启模型合批
结构体指针知识要点总结
编程大杂烩(四)
[21 Days Learning Challenge] Image rotation problem (two-dimensional array)
转:管理是对可能性的热爱,管理者要有闯进未知的勇气
Towards Real-Time Multi-Object Tracking (JDE)
JVM Notes
word 公式编辑器 键入技巧 | 写数学作业必备速查表
Towards Real-Time Multi-Object Tracking(JDE)
符号表
C Expert Programming Chapter 5 Thinking about Linking 5.2 Advantages of Dynamic Linking
C专家编程 第4章 令人震惊的事实:数组和指针并不相同 4.3 什么是声明,什么是定义
文献管理工具 | Zotero
数的划分之动态规划
drools from download to postman request success
震惊,99.9% 的同学没有真正理解字符串的不可变性
力扣题解8/3