[编程题] lc:剑指 Offer 14- I. 剪绳子
题目描述
输入输出例子
思路
方法1、从数据公式上探索
Java代码
class Solution {
public int cuttingRope(int n) {
//情况1:对于两种极端情况先讨论
if(n==1 || n==2){return 1;}
//情况2:对于n=3的时候,也是只能分成了2*1一种结果
if(n==3){return 2;}
//情况3:当n>3的时候,可分的情况就多了。如下
int a = n/3;
int b = n%3;
//3.1如果是b=0
if(b==0){
return (int)Math.pow(3,a);
}else if(b==1){
return (int)Math.pow(3,a-1)*2*2; //3.2如果是b=1,把最后一个3和1 分为2*2的结果
}else{
return (int)Math.pow(3,a)*2; //如果余数b=2的话,就直接乘在后边,不分了
}
}
}
输出的效率:
方法2:动态规划
参考讲解:动态规划解决剪绳子问题
力扣社区
Java代码
//方法2:动态规划
public int cuttingRope(int n) {
int[] dp = new int[n + 1];
//极端条件
if(n==1 || n==2){
dp[1] = 1;
dp[2] = 1;
}
//遍历当绳子长度是3,4,5,...n的时候的情况,dp数组是存储之前的一些计算好的状态值的,空间换时间
for (int i = 3; i <=n; i++) {
for (int j = 0; j < i; j++) {
//在java中max api中为2个参数,所以这里用两个max.本质是想max(dp[i],j*dp[i-j],j*(i-j))
//后边 max中的两参数思想是:10分为了1和9,参数1:1*dp(9) 参数2:1*9
dp[i] = Math.max(dp[i], Math.max(j * dp[i - j], j * (i - j)));
}
}
return dp[n];
}
输出: