- 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
- 贪心算法
- rec[i]:长度为i时可得到的最大乘积
- 由于是相乘,所以rec[1,2,3]为1,2,3
- Java代码
public class Solution {
public int cutRope(int target) {
if (target <2) return 0;
if (target == 2) return 1;
if (target == 3) return 2;
int[] rec = new int[target+1];
rec[0] = 0;
rec[1] = 1;
rec[2] = 2;
rec[3] = 3;
for(int i = 4; i <= target; i++) {
int max = 0;
for(int j = 1; j<=i/2; j++) {
max = Math.max(rec[j]*rec[i-j], max);
}
rec[i] = max;
}
return rec[target];
}
}
class Solution {
public:
int cutRope(int number) {
if(number<2) return 0;
if(number == 2) return 1;
if(number == 3) return 2;
vector<int> rec(number+1, 0);
rec[0] = 0;
rec[1] = 1;
rec[2] = 2;
rec[3] = 3;
for(int i = 4;i<=number; i++){
int _max = 0;
for(int j = 1; j<=i/2;j++)
{
if(rec[j]*rec[i-j]>_max)
_max = rec[j]*rec[i-j];
}
rec[i] = _max;
}
return rec[number];
}
};
网友评论