剪绳子
public class Solution { public int cutRope(int target) { //动态规划 //边界值处理 if(target <2){ return 0; } //将大问题拆分出小问题,为了避免从上到下切分的时候重复计算小问题。 //故从下至上计算。将计算出来的值进行保存。 if(target==2){ return 1; } if(target == 3){ return 2; } //创建一个数组用于存储小问题的值 //因为target对应的值也要放进来,所以长度需要+1 //该数组存放的是长度为索引值得时候,最大乘积是多少,最大乘积放到了相应索引值的位置 int[] arr = new int[target+1]; arr[0] = 0; arr[1] = 1; arr[2] = 2; arr[3] = 3; //从下往上开始判断 for(int i = 4;i<=target;i++){ //计算j的时候可以利用i作为基础,使用已经计算好的值 int max = 0; for(int j=1;j<=i/2;j++){ //利用arr[j]和arr[i-j]已经计算出来了。因为这j i-j都比i小 //按照从小到大,所以肯定是已经计算出来了 int res = arr[j]*arr[i-j]; if(res>max){ max=res; } arr[i] = max; } } return arr[target]; } }