代碼隨想錄打卡第40天 343. 整數(shù)拆分 96. 不同的二叉搜索樹

343. 整數(shù)拆分

https://leetcode.cn/problems/integer-break/

算法思想:

dp[i] 對i進行拆分,獲得最大的乘積

遞推公式:

情況1:

dp[i] = j *dp[i-j]

j可以從1開始枚舉,固定j不變,變化i-j的結(jié)果取得最大乘積

dp[i-j] != i-j

最后的遞歸公式是:

dp[i] = max(j * dp[i-j], j*(i-j))

j遍歷取最大值。

因為最大的乘積因子肯定是近似的,因此j遍歷到i/2就可以了

class Solution {

public:

? ? int integerBreak(int n) {

? ? ? ? vector<int> dp(n+1, 0);

? ? ? ? dp[0]=0;

? ? ? ? dp[1] =0;

? ? ? ? dp[2] = 1;

? ? ? ? for(int i = 3;i<=n;i++ )

? ? ? ? {

? ? ? ? ? ? for(int j=1;j<=i/2;j++)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? dp[i] = max(dp[i], max(j * dp[i-j], j* (i-j)));

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return? dp[n];

? ? }

};

96. 不同的二叉搜索樹

https://leetcode.cn/problems/unique-binary-search-trees/

算法思想:

dp[n]表示n個節(jié)點組成的二叉搜索樹共有dp[i]個。

可以枚舉根節(jié)點的值,當根節(jié)點是從1-n時的情況。

dp[n]為枚舉的結(jié)果的和。

遞推公式:

dp[n] = dp[j-1]* dp[i-j]

class Solution {

public:

? ? int numTrees(int n) {

? ? ? ? vector<int> dp(n+1, 0);

? ? ? ? dp[0] = 1;

? ? ? ? dp[1] = 1;

? ? ? ? for(int i=2;i<=n;i++)

? ? ? ? {

? ? ? ? ? ? for(int j=1;j<=i;j++)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? dp[i] += dp[j-1]*dp[i-j];

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return dp[n];

? ? }

};

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容