题目
思路 动态规划
初始化dp数组,绳子长度从3-n遍历,结果依赖于前面更小长度绳子的结果。
代码
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n + 1);
dp[1] = 1;
dp[2] = 1;
for(int i = 3; i <= n; i++){
int maxx = 0;
for(int j = 1; j < i; j++){
maxx = max(maxx, max(j, dp[j]) * (i - j));
}
dp[i] = maxx;
}
return dp[n];
}
};
思路 数学
每小段绳子长度为3能得到最大乘积,所以让n除以3,得到商和余数。余数分0、1、2三种情况讨论,余数为1时,把3+1拆成2+2能得到更优结果。
代码
class Solution {
public:
const int mod = 1000000007;
int cuttingRope(int n) {
if(n <= 3) return n-1;
int a = n / 3, b = n % 3;
long ans = 1;
for(int i = 1; i < a; i++)
ans = 3 * ans % mod;
if(b == 0)
return (int)(ans * 3 % mod);
else if(b == 1)
return (int)(ans * 4 % mod);
else
return (int)(ans * 6 % mod);
}
};
快速幂 递归版
class Solution {
public:
const int mod = 1000000007;
long mypow(int x, int y){
if(y == 0) return 1;
if(y & 1) return (long)x * mypow(x, y - 1) % mod;
else{
long tmp = mypow(x, y / 2) % mod;
return tmp * tmp % mod;
}
}
int cuttingRope(int n) {
if(n <= 3) return n-1;
int a = n / 3, b = n % 3;
if(b == 0)
return mypow(3, a) % mod;
else if(b == 1)
return mypow(3, a - 1) * 4 % mod;
else
return mypow(3, a) * 2 % mod;
}
};
快速幂 迭代版
class Solution {
public:
const int mod = 1000000007;
long mypow(int x, int y){
long ans = 1;
while(y){
if(y & 1)
ans = ans * x % mod;
x = (long)x * x % mod;
y >>= 1;
}
return ans;
}
int cuttingRope(int n) {
if(n <= 3) return n-1;
int a = n / 3, b = n % 3;
if(b == 0)
return mypow(3, a) % mod;
else if(b == 1)
return mypow(3, a - 1) * 4 % mod;
else
return mypow(3, a) * 2 % mod;
}
};