給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1並且m>1),每段繩子的長度記為 k[0],k[1]…k[m-1] 。請問 k[0]k[1]…*k[m-1] 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。
示例 1:
輸入: 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1
示例 2:
2 <= n <= 58
解題思路:
ⅰ 動態規劃 定義dp[i]為長度為i的繩子通過剪斷得到的最大積值
等式關係:dp[i] = max(dp[i],dp[j]*dp[i-j]); //每剪一次,將最大值存入dp[i]
ⅱ 數學方法:取最多的3時取得最大值,遇4取4(4 .> 22分)
為什麼不是2? 因為33分》222分
n = 3a + b(b =0or1or2) 利用除法取餘 和冪函式pow(底數,冪次)可求得積
tips:注意234等不用分割反積而更大的特殊情況
class
solution
}
return dp[n];*/
//取最多的3時取得最大值,遇4取4
/*if(n <= 3) return n-1;
int maxvalue = 1;
while(n > 4)
return maxvalue*n;*/
//直接用庫函式
if(n <=3)
return n-1;
int a = n/3;
int b = n%3;
if(b ==1)
return
pow(
3,a-1)
*4;else
if(b ==0)
return
pow(
3,a)
;else
return
pow(
3,a)*2
;}};
★
當n值較大時
答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1
//貪心+快速冪or迴圈冪
class
solution
return (int)(maxvalue*n%1000000007);*/
/*if(n <= 3) return n-1;
int a = n/3;
int b = n%3;
if(b == 0) return (int)pow(3,a)%1000000007; //pow的返回值是double型別,不能進行取餘操作
else if(b == 1) return 4*(int)pow(3,a-1)%1000000007;
else return 2*(int)pow(3,a)%1000000007;*/
//快速冪
if(n <=3)
int a = n /3;
int b = n %3;
if(b ==2)
else
}// private long quickpow(int x, int n)
// long y = quickpow(x, n / 2);
// return (n & 1) == 1 ? (y * y * x) % 1000000007 : (y * y) % 1000000007;
// }
private
long
quickpow
(int x,
long n)
tt *
= tt;
tt %
=1000000007
; n /=2
;}return res;}}
}};//遞迴
/*class solution
public long process(long n)
}*///基於貪心的動態規劃
/*class solution
return dp[n];
}};*/
面試題14 I 剪繩子
題目 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 請問 k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。示例 1 輸...
面試題14 剪繩子
長度為n的繩子,剪為m段,求最大乘積 思路 第一刀後 f n f i f n i 從下到上計算,4可被分為兩個2段 5可分為乙個2乙個3 int maxproductaftercutting int length int max 0 product 1 1 product 2 2 product 3...
面試題14 剪繩子
面試題14 剪繩子 題目 給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘 積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此 時得到最大的乘積18。思路 動態規劃為了...