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。思路 動態規劃 任何動態規劃都是由遞迴演...