343
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n+1, 0);
dp[1]=0;
dp[2]=1;
for (int i=3; i<=n; i++) {
for (int j=1; j<i-1; j++) {
int bigger=max(i-j, dp[i-j]);
dp[i]=max(dp[i], j*bigger);
}
}
return dp[n];
}
};
96 思路很巧妙 递推公式最难想 要想到以什么数值为头节点 左边剩几个数右边剩几个数 即dp[几]
初始化的时候要考虑到定义的dp数组的size
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1, 0);
dp[0]=1;
dp[1]=1;
if (n>1) dp[2]=2;
for (int i=3; i<=n; i++) {
for (int j=0; j<i; j++) {
dp[i]+=dp[j]*dp[i-1-j];
}
}
return dp[n];
}
};