dp[i]:对i进行拆分,相乘得到的最大值dp[i]
递推公式:
dp[i] = max(dp[i], j * (i - j), j * dp[i - j]);
为什么还要dp[i[放进去比较?
——这其实是在不断更新dp[i]的值,不放进的话,原本的dp[i]会直接被舍弃
初始化:dp[0]和dp[1]都是没有意义的,所以初始化为零,dp[2]=1
为什么只需要对i-j进行拆分?
——这里类似于一个组合问题,当就j > i/2时,情况就开始重复出现了
遍历顺序:从前向向后
int *initDP(int num){
int* dp = (int*)malloc(sizeof(int)*(num + 1));
int i;
for(i = 0; i < num + 1; ++i){
dp[i] = 0;
}
return dp;
}
int max(int num1, int num2, int num3){
int tempMax = num1 > num2 ? num1 : num2;
return tempMax > num3 ? tempMax : num3;
}
int integerBreak(int n) {
int *dp = initDP(n);
dp[2] = 1;
int i;
for(i = 3; i <= n; ++i){
int j;
for(j = 1; j < i - 1; ++j){
dp[i] = max(dp[i], j * (i - j), j* dp[i-j]);
}
}
return dp[n];
}
dp[i]:输入i时, 有dp[i]种情况
递推公式:dp[i]+=dp[j-1]*dp[i-j];——有多少种二叉树,是左子树的数量乘上右子树的数量,由于二叉搜索树的原因,左子树肯定是有j,右子树是i-j
初始化:dp[0] = 1,dp[1] =1因为根结点为0或1是所有二叉树的种类之一,其余都要初始化为零,因为要不断的累加,所以说要从零开始累加
遍历顺序:从前向后
int *initDP(int n){
int *dp = (int*)malloc(sizeof(int)*(n + 1));
int i;
for(i = 0; i <= n; ++i){
dp[i] = 0;
}
return dp;
}
int numTrees(int n) {
int *dp = initDP(n);
dp[0] = 1;
int i,j;
for(i = 1; i <= n; ++i){
for(j = 1; j <= i; ++j){
dp[i] += dp[j - 1]*dp[i - j];
}
}
return dp[n];
}
文章介绍了使用动态规划解决整数拆分问题,寻找将整数i拆分成若干部分相乘的最大值的方法,以及计算不同二叉搜索树数量的递推过程。着重讲解了dp数组的初始化和遍历顺序的重要性。
1227

被折叠的 条评论
为什么被折叠?



