题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
输入描述:
输入一个数n,意义见题面。(2 <= n <= 60)
输出描述:
输出答案。
示例1
输入
复制
8
输出
复制
18
题解:我们只关心最大乘积,而不关心具体将绳子减为几段。当1<n<4时,绳子减后最大乘积都等于n-1;而当绳子长度n>=4时,我们假设将绳子分为两段(这两段可以再次往下分,也可以不分)我们想得到这两段绳子的最大乘积,就表示希望这两个绳子现在的结果越大越好的dp[i]=max(最大乘积,绳子的长度),dp[n-i]=max(最大乘积,绳子的长度),dp[n]=max(dp[i]*dp[n-i]) i<=n/2
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
int n;
cin>>n;
if(n<2){
return 0;
}else if(n<=3){
return n-1;
}
vector<int> dp(n+1,0);
dp[1] = 1; dp[2] = 2; dp[3] = 3;//当n<4是存储不切割时的数,
//当n>4时存储n切割成两部分得到的最大值(这两部分可以在切割,也可以不切割
//我们不在意他具体切割成几段。
for(int i=4;i<n+1;i++){
int temp=0;
for(int j=i-1;j>=n/2;j--){
if(dp[j]*dp[i-j]>temp){
temp=dp[j]*dp[i-j];
}
}
dp[i]=temp;
}
cout<<dp[n];
}
。