题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
输入描述:
输入一个数n,意义见题面。(2 <= n <= 60)
输出描述:
输出答案。
牛客链接:
解题思路:
此为划分型动态规划
考虑到必然有一个点把绳子分成两份,两份各自分割得出的乘积最大值,组成整条绳子乘积的最大值。
因此存在最小子问题。
考虑最后一步:
必然有一个点,把number分成两段,两段分别构成最小子问题。
两段的最大值的乘积,也是number所求的最大值。
设划分点为i,f[i]表示长度为i的绳子的乘积最大值。
转移方程:
f[i] = MAX{f[j]*f[i-j]}|0<j<i
那么我们求的就是f[number]
代码:
#include<algorithm>
class Solution {
public:
int cutRope(int number) {
int* f = (int*)malloc(sizeof(int)*(number+1));
for(int i=1; i<=number; i++) {
if(i == number) {
f[i] = 1;
} else {
f[i] = i;
}
for(int j=1; j<i; j++) {
f[i] = max(f[i], f[j]*f[i-j]);
}
}
return f[number];
}
};
参考链接:
https://www.nowcoder.com/questionTerminal/57d85990ba5b440ab888fc72b0751bf8