剑指offer 14.剪绳子
1、贪心算法
数学推导:得出尽可能将绳子以长度3切分,乘积最大
LeetCode推导过程
当n整除3后绳长为0时,返回3的n/3次方;
当n整除3后绳长为1时,应将前一个3与剩余的1拆分成2和2,返回3的n/3-1次方 * 22;
当n整除3后绳长为2时,返回3的n/3次方2
public:
int cuttingRope(int n) {
if(n == 2)
return 1;
if(n == 3)
return 2;
int res = 0;
if(n>=3)
{
int a = n / 3;
if(n % 3 == 0)
res = pow(3,a);
if(n % 3 == 1)
res = pow(3,a-1)*4;
if(n % 3 == 2)
res = pow(3,a)*2;
}
return res;
}
};
2、动态规划思路
当n=2时,直接返回1;
当n=3时,直接返回2;
当n>3时,开始用动态规划方法解决;
//动态规划算法
class Solution {
public:
int cuttingRope(int n) {
if(n == 2)
return 1;
if(n == 3)
return 2;
vector<int> dp(n+1, 0);
if(n>=4)
{
//对于绳子小于等于3的部分,不需再进行切分,直接取其长度
dp[1]=1, dp[2]=2, dp[3]=3;
for(int i=4; i<=n; i++)
{
for(int j=1; j<=i/2; j++)
{
if(dp[i] < dp[j]*dp[i-j])
dp[i] = dp[j]*dp[i-j];
}
}
}
return dp[n];
}
};