class Solution {
// 从下往上,动态规划。O(n^2)
// 绳长为n,
public int cuttingRope(int n) {
int[] dp=new int[n+1];
for (int i = 2; i < dp.length; i++) {
int max=0;
for (int j = 1; j < i; j++) {
max=Math.max(max,Math.max(j*(i-j),j*dp[i-j]));
}
dp[i]=max;
}
return dp[n];
}
}
// 数学解法,证明看解析
// class Solution {
// public int cuttingRope(int n) {
// if(n==1||n==2||n==3){
// return n-1;
// }
// int a=n/3;
// int b=n%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;
// }
// }
// 超时,从上往下,最无脑暴力解法
// public int integerBreak(int n) {
// if (n == 2) {
// return 1;
// }
// int res = -1;
// for (int i = 1; i <= n - 1; i++) {
// res = Math.max(res, Math.max(i * (n - i), i * integerBreak(n - i)));
// }
// return res;
// }