class Solution {
public int cuttingBamboo(int bamboo_len) {
if (bamboo_len <= 3)
return bamboo_len - 1;
int a = bamboo_len / 3;
int b = bamboo_len % 3;
if (b == 0)
return (int) Math.pow(3, a);
if (b == 1)
return (int) Math.pow(3, a - 1) * 4;
return (int) Math.pow(3, a) * 2;
}
}
共以下 10 个回答
时间复杂度O(1)
空间复杂度O(1)
解题思路
– 动态规划的实现有点类似于遍历破解,只是提供了更加规范的一些套路
– 定义int[] dp=new int[n+1] 去存放长度为1,2,3…n的中间数据,为什么要n+1,因为把数组的下标作为长度,最长的长度是n,那么数组的长度应该是n+1(下标0未被使用)
– 两层循环,第一层循环用于定义不同长度,i=2~n;第二层循环用于定义第一段的长度j,j=2~ i-1;
– dp[i]值的条件应该是=Math.max(j * (i – j), j * dp[i – j]); 并且每一次j循环都要尝试去更新这个dp[i]值
– 这个Math.max(j * (i – j), j * dp[i – j])有点类似于递归,它是如何在程序中实现的呢?还是因为我们给了起点值dp[2] = 1,dp[i]的设置都是从小到大完成的,所以外层循环一定要是2~n的遍历
【题解1】动态规划
【题解2】贪心,前提是要知道数学规律
– n<=3的时候,最大乘积=n-1
– n>=4的时候,最大乘积就是把n尽可能分成3的若干份,即n=a3+b
– 当b=0,结果为Math.pow(3,a);
– 当b=1,需要n=(a-1)3+(3+1),结果为 Math.pow(3,a-1)(22) ,其中22是分割4获取到的
– 当b=2,结果Math.pow(3,a)2
尽量将绳子切分成长度为3。若出现余数为1,则需要将最后一段变为长度为4。
时间复杂度O(1),空间复杂度O(1)。
数学题~
思路:记忆化搜索、动态规划、数学推导三等分
时间复杂度:O(n^2^)、O(n^2^)、O(n)。
空间复杂度:O(n)、O(n)、O(1)。
思路: 使用动态规划 处理 纯数学推导解法头疼 不想看
动态规划
On2 on
lass Solution {
public int cuttingBamboo(int bamboo_len) {
// 边界条件
if (bamboo_len <= 3) {
return bamboo_len – 1; // 竹子长度 <=3 时,直接返回最大乘积
}
}