题目链接

LeetCode

题目描述

把一根绳子剪成多段,并且使得每段的长度乘积最大。

  1. n = 2
  2. return 1 (2 = 1 + 1)
  3. n = 10
  4. return 36 (10 = 3 + 3 + 4)

解题思路

贪心

尽可能多剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现。如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长度为 2 的绳子。
证明:当 n >= 5 时,3(n - 3) - n = 2n - 9 > 0,且 2(n - 2) - n = n - 4 > 0。因此在 n >= 5 的情况下,将绳子剪成一段为 2 或者 3,得到的乘积会更大。又因为 3(n - 3) - 2(n - 2) = n - 5 >= 0,所以剪成一段长度为 3 比长度为 2 得到的乘积更大。

  1. class Solution {
  2. public:
  3. int integerBreak(int n) {
  4. vector<int> a;
  5. int ret = 1;
  6. if(n<=3)
  7. return n-1;
  8. while(n>4){
  9. n-=3;
  10. a.push_back(3);
  11. }
  12. a.push_back(n);
  13. for(int i=0;i<a.size();i++)
  14. ret*=a[i];
  15. return ret;
  16. }
  17. };

动态规划

** image.png

  1. class Solution {
  2. public:
  3. int integerBreak(int n) {
  4. if(n<4)
  5. return n-1;
  6. vector<int> dp(n+1);
  7. for(int i=4;i<=n;i++){
  8. int curMax=0;
  9. for(int j=1;j<i;j++){
  10. curMax = max(curMax,max(j*(i-j),j*dp[i-j]));
  11. }
  12. dp[i]=curMax;
  13. }
  14. return dp[n];
  15. }
  16. };