class Solution(object):
def cuttingRope(self, n):
"""
:type n: int
:rtype: int
"""
dp = [0] * (n + 1)
for i in range(2, n + 1):
for j in range(i):
dp[i] = max(dp[i], j * (i - j), j * dp[i - j])
return dp[n]
class Solution {
public:
int cuttingRope(int n) {
if (n < 4) return n - 1;
int mod = n % 3;
if (mod == 1) return std::pow(3, n / 3 - 1) * 4;
else if (mod == 2) return std::pow(3, n / 3) * 2;
else return std::pow(3, n / 3);
}
};
// dp
class Solution {
int[] memo; // 备忘录
public int cuttingRope(int n) {
memo = new int[n + 1];
return dp(n);
}
int dp(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
if (memo[n] > 0) return memo[n];
int res = Integer.MIN_VALUE;
for (int i = 1; i <= n; i++) {
int compareRes = i * Math.max(dp(n - i), n - i); // dp func
res = Math.max(res, compareRes);
}
memo[n] = res;
return res;
}
}
class Solution {
public int cuttingRope(int n) {
if(n >= 2) return 1;
if(n == 3) return 2;
int res = n / 3;
int mod = n % 3;
if(mod == 0) {
return pow(3, res);
} else if(mod == 1){
return pow(3, res - 1) * 4;
} else {
return pow(3, res) * 2;
}
}
public int pow(int x, int n){
int sum = 1;
while(n != 0){
if((n & 1) == 1){
sum *= x;
}
x = x*x;
n = n >>1;
}
return sum;
}
}
共以下 25 个回答
“`java
//大于等于4的都可以拆分成2*(x-2),而3个2又可以转为2个3,所以就是先截3
class Solution {
public int cuttingBamboo(int bamboo_len) {
if (bamboo_len <= 3) { return bamboo_len - 1; } int quoient = bamboo_len/3; int remainder = bamboo_len%3; if (remainder == 1) { return (int)Math.pow(3, quoient - 1) * 4; } else if (remainder == 2){ return (int)Math.pow(3, quoient) * remainder; } else { return (int)Math.pow(3, quoient); } } }
class Solution {
public int cuttingRope(int n) {
if(n<=2){
return 1;
}
if(n3){
return 2;
}
int res = n/3;
int mod = n%3;
if(mod0){
return pow(3,res);
}
if(mod1){
return pow(3,res-1)4;
}
if(mod2){
return pow(3,res)2;
}
return 0;
}
public int pow(int a,int b){
int sum = 1;
for(int i=0;i<b;i++){
sum= sum*a;
}
return sum;
}
}
使用数学规律
“`C++ dp(n + 1, 0);
int cuttingRope(int n) {
vector
dp[2] = 1; // 初始化,当绳子长度为 2 时只有一种剪法,剪成两段长度都为 1
}
“`
数学分析
动态规划
动态规划 时间复杂度O(n^2) 空间复杂度O(n)
时间复杂度和空间复杂度都为o(1)
【思路】将n拆解为3和2的组合
【复杂度】时间空间均为O(1)
想不出来,看官解的
时间:O(1)
空间:O(1)
MY帅弟
时间复杂度是O(1)
空间复杂度是O(1)
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度:O(logN)
空间复杂度:O(1)
直接看答案系列。
n由3组成,则乘积是最大的,则n是三的倍数余0余1余2的情况
动规标准解法
思路:动态规划——dp[i]代表长度为i时的最大剪绳乘积;状态转移方程:将i分为j与i-j,若i-j不继续分割,则结果为j(i-j); 若i-j继续分割,则结果为jdp[i-j]
时间复杂度:O(n²) 空间复杂度:O(n)
“class Solution{
public:
int cuttingRope(int n){
if(n<=2){
return 1;
}
if(n 3){
return 2;
}
int res = n/3;
int mod =n%3;
if(mod 0){
return pow(3,res);
}else if(mod 1){
return pow(3,res-1) * 4;
}else {
return pow(3,res) * 2;
}
}
int pow(int a, int n){
int sum =1;
for(int i=1; i<=n; i++){
sum =sum * a;
}
return sum;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
时间复杂度O(n) 空间复杂度O(1)
时间复杂度O(n)