【14. 剪绳子】剑指offer-JAVA实现

102 阅读1分钟

题目描述

把一根绳子剪成多段,并且使得每段的长度乘积最大。

思路

1.动态规划

  自顶向下分析问题,自底向上解决问题。

2.贪心(贪心这种肯定要证明的,证不出来还是算了)

代码

1.DP

public int dp(int len) {
		if(len<2) return 0;
		if(len==2) return 1;
		if(len==3) return 2;
		
		int[] prod = new int[len+1];
		prod[0]=0;
		prod[1]=1;
		prod[2]=2;
		prod[3]=3;
		
		int max=0;
		for(int i=4;i<=len;i++) {
			max=0;
			for(int j=1;j<=i/2;j++) {
				int temp = prod[j]*prod[i-j];
				if(temp>max) max=temp;
				prod[i] = max;
			}
			
		}

		return prod[len];
	}

贪心

public int greedy(int len) {
		if(len<2) return 0;
		if(len==2) return 1;
		if(len==3) return 2;
		
		int timesOf3 = len/3;
		if(len-timesOf3*3 ==1)
			timesOf3--;
		int timesOf2 = (len-timesOf3*3)/2;
		return (int)(Math.pow(2,timesOf2)*Math.pow(3, timesOf3));
		
		 
	}