动态规划解决
剪绳子
http://www.nowcoder.com/questionTerminal/57d85990ba5b440ab888fc72b0751bf8
class Solution {
public:
int cutRope(int number) {
//选取剪绳子的第一段的长度,计算出其最大乘积长度,然后乘以剩余一段的最大乘积长度
//以选出最终的最大乘积长度,每一分割绳子段都是先前过程中计算出来的
//由于已知n>0,m>0,则可以知道绳子必须进行分割,然后建立辅助vector,注意下标的关系
//当number<2时,并不满足题意,返回0
if (number < 2)
return 0;
//当number==2时,
else if(number==2)
return 1;
else if(number == 3)
return 2;
//当number>=4的时候
//则要进行辅助空间的定义
vector<int> dp(number+1,0);
dp[0] = 0;
dp[1] = 1;//剪绳子的第一段都是从1开始的
dp[2] = 2;//代表第一段绳子长度为2,而并不是上面进行返回的最大乘积
dp[3] = 3;//代表第一段绳子长度为3,而不是上面进行返回的最大乘积
for(int i=4;i<=number;i++){
int max=0;
//限制条件为j<=number/2的原因为:如果第一段选取的绳子的长度大于了number的一半
//则将会与先前进行分割的情况重复
for(int j=1;j<=number/2;j++){
max=dp[j]*dp[i-j]>max?dp[j]*dp[i-j]:max;
}
dp[i]=max;
}
return dp[number];
}
};