习题地址 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]; } };