acwing 25. 剪繩子

習題地址 https://www.acwing.com/problem/content/description/24/spa

題目描述code

給你一根長度爲 nn 繩子,請把繩子剪成 mm 段(mm、nn 都是整數,2n582≤n≤58 而且 m2m≥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];
    }
};
相關文章
相關標籤/搜索