習題地址 https://www.acwing.com/problem/content/description/24/spa
題目描述code
給你一根長度爲 nn 繩子,請把繩子剪成 mm 段(mm、nn 都是整數,2≤n≤582≤n≤58 而且 m≥2m≥2)。xml
每段的繩子的長度記爲k[0]、k[1]、……、k[m]。k[0]k[1] … k[m] 可能的最大乘積是多少?blog
例如當繩子的長度是8時,咱們把它剪成長度分別爲二、三、3的三段,此時獲得最大的乘積18。ip
輸入:8 輸出:18
一道數論題目 就是整數能夠拆分紅幾個整數 獲得乘積最大get
可是也能夠使用動態規劃作io
dp[i]表示 長度爲i的繩子能夠拆分獲得的最大結果class
因爲繩子必須拆分 i至少等於2 di
而長度i的各類拆分方案中 假設從長度爲j的位置剪下第一刀 (j < i)動態規劃
那麼乘積就是 j*(i-j)
i-j這個長度是否還須要拆分 那麼取決於dp[i-j]大 仍是i-j大
最後獲得 從長度爲j的位置剪下第一刀 所能獲得的最大乘積結果
j的取值範圍是 1到i-1的. 最後 代碼以下:
class Solution { public: int maxProductAfterCutting(int length) { vector<int> dp(length+10,0); for(int i = 2;i <= length;i++){ for(int j= 1;j <i;j++){ dp[i] = max(dp[i] ,max(j*(i-j) ,dp[i-j]*j )); } } return dp[length]; } };