数据结构(八十二)
学习数据结构与算法过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。
—— 剪绳子 ——
1.题目描述
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
示例
输入:
2
输出:
1
解释:
2 = 1 + 1, 1 × 1 = 1
输入:
10
输出:
36
解释:
10 = 3 + 3 + 4, 3 × 3 × 4 = 36
2.代码
c
int max(int a,int b){
if(a > b)
return a;
return b;
}
int cuttingRope(int n){
if(n<3)
return 1;
int *ans = (int *)malloc(sizeof(int) * (n + 1));
ans[0]=1;
ans[1]=1;
ans[2]=2;
for(int i = 3;i <= n;i++)
for(int j = 1;j < i;j++){
ans[i] = max(ans[i],ans[j] * ans[i - j]);
ans[i] = max(ans[i],j * ans[i - j]);
ans[i] = max(ans[i],j * (i - j));
}
return ans[n];
}
c++
class Solution {
public:
int cuttingRope(int n) {
if(n < 3)
return 1;
vector<int>ans(n + 1);
ans[0] = 1;
ans[1] = 1;
ans[2] = 2;
for(int i = 3;i <= n;i++)
for(int j = 1;j < i;j++){
ans[i] = max(ans[i],ans[j] * ans[i - j]);
ans[i] = max(ans[i],j * ans[i - j]);
ans[i] = max(ans[i],j * (i - j));
}
return ans[n];
}
};