前言
仅记录学习笔记,如有错误欢迎指正。
题目
给你一根长度为 n 的绳子,请把绳子剪成整数长的 m 段( m 、 n 都是整数, n > 1 并且 m > 1 , m <= n ),每段绳子的长度记为 k[1],…,k[m] 。请问 k[1]k[2]…*k[m] 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18 。
示例1:
-
输入:8
-
输出: 18
-
说明:8 = 2 +3 +3 , 2* 3* 3=18
示例2:
-
输入:2
-
输出: 1
-
说明:m>1,所以切成两段长度是1的绳子
解法
枚举每一段的可能性暴力解法到 dp, 关键是想出后面的剪法和之前的是有关联的。import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return int整型
*/
public int cutRope (int n) {
// 每段绳子都和之前的有关 递归、动态规划
//dp[i]表示长度为i的绳子可以被剪出来的最大乘积
int[] dp = new int[n+1];
//初值
dp[1] = 1;
dp[2] = 2;
dp[3] = 3;
dp[4] = 4;
for(int i = 5; i<=n;i++){
for(int j = 1;j<i;j++){
dp[i] = Math.max(dp[i],j*dp[i-j]);
}
}
return dp[n];
}
}