动态规划五部
1.dp[i]的含义
2.dp[i]递推式
3.dp的初始化
4.遍历顺序
题目
给你一根长度为 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。
分析:
dp[i] 长度为i时,所得最大乘积
dp[i]怎么求?分两段还是分n段=
j* (i-j) or j*dp[i-j] 其中j由1开始遍历到i-1
dp[i]的初始化,dp[2] = 1;
int cuttingRope(int n) {
//dp[i]拆分长度i得到的最大乘积
//初始化dp[0]= 0;dp[1]=1;
//递推式 dp[i] = max(dp[i], j*(i-j), j*dp[i-j])
vector<int> dp(n+1);
dp[2]=1;
for(int i = 3; i<= n; i++){
for(int j = 0; j< i; j++){
dp[i] = max(dp[i],max(j*(i-j), j*dp[i-j]));
}
}
return dp[n];
}