劍指 剪繩子

2021-10-07 20:52:37 字數 1645 閱讀 7346

1,題目:

2,思路:

方法一:這個是通過數字找規律的:

第一步:定義dp[n]的值的含義為:數字n的乘積最大值

n=2: 1+1 -->11=1; dp[2]=1;

n=3: 2+1 -->21=2; dp[3]=2;

n=4: 2+2 -->22=4; dp[4]=4;

n=5: 3+2 -->32=6; dp[5]=6;

貌似看不出規律,別急再多寫幾個

n=6: 3+3 -->33=9; dp[6]=9;

n=7: 4+3 -->43=12;–>dp[4]3=12 dp[7]=12;

n=8: 5+3 -->63=12;–>dp[5]3=18 dp[8]=18;

n=9: 6+3 -->93=12;–>dp[6]3=27 dp[9]=27;

n=10: 7+3 -->123=36;–>dp[7]*3=36 dp[10]=36;

第二步:找到遞推的規律:

通過上述分析,規律明顯在n=7以後為

if(n>=7)

dp[n] = dp[n-3]*3;

第三步:找初始值:

初始值在第二步找規律已經找到了

n=2: 1+1 -->11=1; dp[2]=1;

n=3: 2+1 -->21=2; dp[3]=2;

n=4: 2+2 -->22=4; dp[4]=4;

n=5: 3+2 -->32=6; dp[5]=6;

n=6: 3+3 -->3*3=4; dp[6]=9;

方法二:動態規劃:

動態規劃,每次都劃分為f(i) * f(n-i),之前的值在dp陣列已經記錄,再遍歷出最大值,因為是對稱的所以從1切到n/2即可。

方法三:貪心演算法:

(其實也是通過找規律得出來的)

貪心演算法,大神們的數學推導,以3劃分乘積最大。

3,**:

方法一:這個是通過數學找的規律

class

solution

//2.找到遞推關係

for(

int i =

7; i <= n; i++

)return dp[n];}

}

方法二:動態規劃:

class

solution

dp[i]

= max;}}

return dp[n];}

}

方法三:貪心演算法:(其實也是通過找規律得出來的)

//貪心演算法,大神們的數學推導,以3劃分乘積最大

public

intcuttingrope

(int n)

else

if(b ==1)

else

}

劍指Offer 剪繩子 和剪繩子

劍指offer 剪繩子 題目描述 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 請問 k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的...

剪繩子 演算法 424,劍指 Offer 剪繩子

給你一根長度為 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 ...

劍指offer 剪繩子

題目 給你一根長度為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。思路 動態規劃 任何動態規劃都是由遞迴演...