动态规划解决剪绳子问题
有思路和解释
```
public int cuttingRope(int n){
if (n<4) return n-1;//小于4的直接返回n-1
int[] dp = new int[n+1];
//初始化
dp[1] = 0;
dp[2] = 1;
dp[3] = 2;
//外层控制总的绳子长度
for (int i = 4; i < dp.length; i++) {
//为什么从2开始?
//一段绳子,剪的话,剪成长度为1和剩下长度,相乘没有意义啊,所以从剪成2和剩余的开始
//从2开始,然后可以剪成3和剩余、4和剩余、5和剩余。。。等
//其中需要找出剪得最大值,即为当前绳子长度所能剪得的乘积最大值
//内层控制当前绳子剪得位置
for (int j = 2; j < i; j++) {
//当前绳子可以剪成j长度和剩余的i-j长度,
//1、Math.max(j*(i-j), j*dp[i-j])找出j长度和剩余长度的乘积最大值
//j*(i-j)表示j长度乘以剩余长度,j*dp[i-j]表示j长度乘以剩余长度的可以继续剪切的乘积最大值
//2、再一次和dp[i],比较取最大值,因为当前绳子可以被剪成2长度和剩余长度,也可以被剪成3和剩余长度。。。
//所以,需要在内循环中寻找当前绳子长度的乘积最大值
'dp[i] = Math.max(dp[i], Math.max(j*(i-j), j*dp[i-j]));'
}
}
return dp[n];
}
```