解法一:动态规划
尤其注意!!
最开始的几个特殊值!!
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; } }