思路一:动态规划
1:首先我们想要求长度为n的绳子剪掉后的最大乘积,可以从前面比n小的绳子转移而来
2:用一个dp数组
记录从0到n长度的绳子剪掉后的最大乘积,也就是dp[i]
表时长度为i
的绳子剪成m段后的最大乘积,初始化dp[2]=1
3:我们把绳子剪掉第一段(长度为j)
,如果只减去1,对最后的乘积没有任何增益,所以长度为2开始剪
4:剪了第一段后,剩下(i-j)
长度可以不剪。如果不剪对应j*(i-j)
;如果剪去对应j*dp[i-j]
。取两者最大值max(j*(i-1),j * dp[i-j])
5:第一段长度j
可以取的区间为[2)
,对所有j不同的情况取最大值,因此最终dp[i]
的转移方程为dp[i] = max(dp[i],j*max(dp[i-j],(i-j)))
class Solution {
public:
int cuttingRope(int n) {
if(n<2) return 0;
vector<int> dp(n+1);//当绳子长度为i时候可能的最大乘积为dp[i]
//确定初始化条件
dp[2]=1; //0跟1减没有意义
for(int i=3;i<=n;i++){
for(int j=2;j<i;j++){ //j表示剪下来的绳子大小,当剪下1时候没意义,所以从2开始
//绳子有两种方式,一种是剪下之后,剩下的再剪下最大为j*dp[i-j]
//一种是剪下之后,剩下的不减了,剩的为j*(i-j);
dp[i] = max(dp[i],j*max(dp[i-j],(i-j))); //里面一直跟之前的遍历减过的结果比较
}
}
return dp[n];
}
};