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];
    }
};
相关文章
相关标签/搜索