题解 | #剪绳子#
剪绳子
http://www.nowcoder.com/practice/57d85990ba5b440ab888fc72b0751bf8
动态规划解决剪绳子问题
有思路和解释
``` 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]; } ```