給你一根長度為 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。
這裡主要是按貪心法的思想去求解。
貪心選擇是採用從頂向下、以迭代的方法做出相繼選擇,每做一次貪心選擇就將所求問題簡化為乙個規模更小的子問題。問題的乙個整體最優解,是從貪心選擇開始的,而且作了貪心選擇後,原問題簡化為乙個規模更小的類似子問題。然後,用數學歸納法證明,通過每一步貪心選擇,最終可得到問題的乙個整體最優解。
數學歸納:
2=1+1,1*1<1+1,可以看出我們在選擇相乘盡可能大時,2是比1更優的選擇
3=1+2,1*2<1+2,可以看出3是比1更優的選擇
4=2+2,2*2=2+2,4和2相同,4可以用2表示
5=2+3,1+2+2,...,2*3是最優的選擇
再往後的數都可以用1,2,3去表示,而3是裡面最優的選擇,並且切分段數越多,乘積一般是越大的
所以我們演算法設計為:
長度為n,n/3,先盡可能的對切分多段長度為3的,
長度不足3的,若為2,因為2比1更優先選擇,所以不拆為1,1,若為1,因為1+3=4,對於4我們是拆分成2+2時,乘積最大。
c++的解決**:
class solution
if(n%3==0)else if(n%3==1)else
}};
python3的解決**:
class solution:
def cuttingrope(self, n: int) -> int:
if n<=3:
return n-1
a=n//3
b=n%3
if b==0:
return pow(3,a)
if b==1:
return pow(3,a-1)*4
return pow(3,a)*2
給你一根長度為 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。
答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。
如果用c++來寫,注意c++的大數溢位問題,是不能直接用乘方去直接取餘的,還要注意pow函式的返回是double型別的,與int型進行計算時是需要強制轉換成int。
在這裡我們是不直接使用pow函式,自定義乙個與pow函式功能相近的newpow函式,在這裡面就完成n個3的相乘,並在每一步都取餘,避免大數的溢位。(newpow函式要定義為long long),newpow可以寫入private,也可以直接寫在public。
c++的解決**:
class solution {
public:
long long newpow(int m){
long long result=1;
for(int i=0;i因為python沒有c++的大數溢位等問題,是可以直接對結果進行直接取餘的,寫起來較簡單。
python3的解決**:
class solution:
def cuttingrope(self, n: int) -> int:
c=1000000007
if n<=3:
return (n-1)%c
a=n//3
b=n%3
if b==0:
return pow(3,a)%c
if b==1:
return pow(3,a-1)*4%c
return pow(3,a)*2%c
劍指offer 剪繩子(C Python)
給你一根長度為n的繩子,請把繩子剪成整數長的m段 m n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 xk 1 x xk m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。思路 動態規劃 定義函式...
leetcode兩數之和 C Python3
給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。方法1 雙迴圈 2 字典 class solution def twosum self,nums lis...
剪繩子問題
給你一根長度為 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。首先是貪婪演算法 ...