剑指offer14 剪绳子
方法一:动态规划
dp[i]表示长度为i的绳子剪后的最大值。
分情况讨论将长度为i的绳子剪下长度为[2,i)的一段后最大乘积。比如剪下的长度为j,剩下(i-j)的长度是否再剪,如果不剪,就是两段,i和i-j相乘,如果剪,就是i和dp[i-j]相乘。
public int cuttingRope(int n){
int[] dp=new int[n+1];
dp[2]=1;
for(int i=3;i<=n;i++){
for(int j=2;j<i;j++){
dp[i]=Math.max(dp[i],Math.max((i-j)*j,dp[i-j]*j));
}
}
return dp[n];
}
方法二:贪心算法
public int cuttingRope(int n){
if(n<=3) return n-1;
int a=n/3;
int b=n%3;
if(b==0) return (int)Math.pow(3,a);
else if(b==1) return (int)Math.pow(3,a-1)*4;
else return (int)Math.pow(3,a)*2;
}
剑指offer83 剪绳子(进阶版)
题意不变,只是输入的绳长范围变大。
class Solution {
public int cuttingRope(int n) {
if(n < 4){
return n - 1;
}
long res = 1;
while(n > 4){
res = res * 3 % 1000000007;
n -= 3;
}
return (int) (res * n % 1000000007);
}
}