JZ67 剪绳子,动态规划法 & 数学公式法
剪绳子
http://www.nowcoder.com/questionTerminal/57d85990ba5b440ab888fc72b0751bf8
解法一:动态规划
尤其注意!!
最开始的几个特殊值!!
n==2, return 1,
n==3, return 2.
验证了最开始的这些特殊值,循环才能平稳地走下去。
注意,如果用这种写法,dp[i]中储存的元素不能小于i本身。
然而只有n==4时,2*2=4才不小于4,所以要手动填充dp[1],dp[2],dp[3]。
public class Solution {
public int cutRope(int target) {
if(target==2) return 1;
if(target==3) return 2;
int[] dp=new int[target+1];
dp[1]=1; dp[2]=2; dp[3]=3;
for(int i=4; i<target+1; i++){
for(int j=1; j<i; j++)
dp[i]=Math.max(dp[i], dp[i-j]*j);
}
return dp[target];
}
}解法二:数学公式法
非原创,原出处见
https://www.nowcoder.com/questionTerminal/57d85990ba5b440ab888fc72b0751bf8?answerType=1&f=discussion
速度比动态规划快一倍。
实在是太强了!
import java.util.*;
public class Solution {
public int cutRope(int target) {
if(target<=0) return 0;
if(target==1 || target == 2) return 1;
if(target==3) return 2;
int m = target % 3;
switch(m){
case 0 :
return (int) Math.pow(3, target / 3);
case 1 :
return (int) Math.pow(3, target / 3 - 1) * 4;
case 2 :
return (int) Math.pow(3, target / 3) * 2;
}
return 0;
}
}
查看7道真题和解析