(LeetCode 343)正数拆分 [简单dp]

mac2022-06-30  85

题目: 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

分析: 设dp[i]表示正数i拆分可以获得的最大值。 数 i 可以被分为 j 和 i-j 两部分,并且都比 i 小。 所以dp[i] 为这两部分的最大值的乘积。 由于i 已经分为了两部分,所以对于 j 和 i-j 而言,它们有两种选择,以j 为例: 1:不再拆分,值为他们本身 j。 2:继续拆分,值为dp[j]。

所以dp[i]的值为这两部分分别的最大值的乘积,即: dp[i] = max(dp[j],j) * max(dp[i-j],i-j)

代码:

class Solution { public: int integerBreak(int n) { int dp[n+1]; memset(dp,0,sizeof(dp)); dp[1] = 1; for(int i=2;i<=n;i++) { for(int j=1;j<i;j++) { dp[i] = max(dp[i], max(dp[j],j)*max(dp[i-j],i-j)); } } return dp[n]; } };
最新回复(0)