今天继续动态规划的题目
题目描述
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例
输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
思路:
这道题目我刚看到是茫然的,想到这个是动态规划的题目,于是先确认dp[i]的含义:正整数i的最大化乘积。
有了这个含义,递归公式显然得到dp[i]=max(dp[i-1]*1,(i-1)*1,dp[i-2]*2,(i-2)*2,...,dp[1]*(i-1),1*(i-1));
初始化dp[1]=1;
我在实现的过程中,把本来的1-n转换成0-(n-1),理解起来可能与思路有所出入;
代码
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n,0);
dp[0]=1;
int i,j;
int max_value=0;
for(i=1;i<n;i++)
{
//求dp[i]=max(dp[0]*i,...,dp[i-1]*1)
for(j=0;j<i;j++)
{
max_value=max(max_value,dp[j]*(i-j));
max_value=max(max_value,(j+1)*(i-j));
}
dp[i]=max_value;
max_value=0;
}
return dp[n-1];
}
};