● 343. 整数拆分
1.dp表示的是i的数的拆分最大值。
2.dp[1]=0,dp[2]=1;
3.mymax=max(j*(i-j),j*dp[i-j]);(这里的递推公式不是很好想,有点抽象需要分为两种情况)
4.从前到后
5.略
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n+1);
dp[0]=0;
dp[1]=0;
dp[2]=1;
for(int i=3;i<=n;i++)
{
int mymax=0;
for(int j=1;j<=i/2;j++)
{
if(mymax<max(j*(i-j),j*dp[i-j]))
mymax=max(j*(i-j),j*dp[i-j]);
}
dp[i]=mymax;
}
return dp[n];
}
};
96.不同的二叉搜索树
1.dp[i]是i个节点的构成树的个数。
2.这道题的想法其实非常巧妙。使用动态规划。对n个节点,如果我们遍历从1到n为头节点的情况,对于其中任意一种情况j,比j大的有i-j,比j小的左子树有j-1,所以一共有dp[i-j]*dp[j-1] 种的情况。
3.dp[0]=1;其余均可推出!
4.从前到后。
5.略
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1,0);
dp[0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
dp[i]+=dp[j-1]*dp[i-j];
}
}
return dp[n];
}
};