当前位置:网站首页>力扣: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;
}
};
边栏推荐
- [Evaluation model] Topsis method (pros and cons distance method)
- Explain detailed explanation and practice
- Do you think border-radius is just rounded corners?【Various angles】
- 【流程图】
- Performance testing with Loadrunner
- C Expert Programming Chapter 4 The Shocking Fact: Arrays and Pointers Are Not the Same 4.5 Other Differences Between Arrays and Pointers
- 少年成就黑客,需要这些技能
- C专家编程 第5章 对链接的思考 5.3 函数库链接的5个特殊秘密
- As soon as flink cdc is started, the CPU of the source Oracle server soars to more than 80%. What is the reason?
- The symbol table
猜你喜欢
随机推荐
应届生软件测试薪资大概多少?
心余力绌:企业面临的软件供应链安全困境
Cache pool of unity framework
Structure function exercise
C专家编程 第4章 令人震惊的事实:数组和指针并不相同 4.5 数组和指针的其他区别
[Cocos 3.5.2]开启模型合批
System design. How to design a spike system (full version transfer)
8. Haproxy builds a web cluster
DataTable使用Linq进行分组汇总,将Linq结果集转化为DataTable
The 2022 PMP exam has been delayed, should we be happy or worried?
你以为border-radius只是圆角吗?【各种角度】
leetcode 12. 整数转罗马数字
有趣的 Kotlin 0x0E:DeepRecursiveFunction
el-Select selector bottom fixed
Interesting Kotlin 0x0E: DeepRecursiveFunction
[Cocos] cc.sys.browserType可能的属性
C Expert Programming Chapter 5 Thinking about Chaining 5.6 Take it easy --- see who's talking: take the Turning quiz
【SemiDrive源码分析】【MailBox核间通信】47 - 分析RPMSG_IPCC_RPC 方式 单次传输的极限大小 及 极限带宽测试
share总结
How to dynamically add script dependent scripts