Leetcoder Day36| 動態規劃part03

343. 整數拆分

給定一個正整數?n,將其拆分為至少兩個正整數的和,并使這些整數的乘積最大化。 返回你可以獲得的最大乘積。

示例 1:

  • 輸入: 2
  • 輸出: 1
  • 解釋: 2 = 1 + 1, 1 × 1 = 1。

示例?2:

  • 輸入: 10
  • 輸出: 36
  • 解釋: 10 = 3 + 3 + 4, 3 ×?3 ×?4 = 36。
  • 說明: 你可以假設?n?不小于 2 且不大于 58。

本題需要注意的是,至少拆成2個正整數的和,而不是正好是2個正整數。

  1. 確定dp數組以及下標的含義:dp[i]為整數i拆分后的最大乘積
  2. 確定遞推公式:假如將i拆分為j和i-j,這里j不只是代表一個數字而是一可能由j個整數組成的乘積。如果從1遍歷到j,有兩種途徑可以得到dp[i],一個是dp[i]=j*(i-j),另一個是dp[i]=j*dp[i-j],這里dp[i-j]代表i-j這個數字被拆分后的最大值。
  3. dp數組如何初始化:本題將i拆成0是沒有意義的,所以不考慮,1拆開只能是1和0,也是沒有意義的,所以從2開始初始化,2可以拆成1 + 1,因此dp[2]=1
  4. 確定遍歷順序:既然初始化是從2開始的,所以i從3開始遍歷,j從1開始遍歷,到i停止。
  5. 舉例推導dp數組:沒法通過簡單計算舉例。
class Solution {public int integerBreak(int n) {int[] dp=new int[n+1]; dp[2]=1;for(int i=3;i<=n;i++){for(int j=1;j<i;j++){dp[i]=Math.max(dp[i], Math.max(j*dp[i-j], j*(i-j)));}}return dp[n];}
}

??本題的優化思路:其實將對于j的遍歷條件改為: j<i-1可以節省一步計算,因為如果讓j=i-1,其實在 j = 1的時候,這一步就已經拆出來了,屬于重復計算,所以 j < i - 1。

更優化一步,可以這樣:

for (int i = 3; i <= n ; i++) {for (int j = 1; j <= i / 2; j++) {dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));}
}

因為拆分一個數i使之乘積最大,比如i=x+(i-x) dp[i]=x(i-x)=xi-x^2,這時是一個向下的拋物線,最大點為x/2

96.不同的叉搜索樹

給定一個整數 n,求以 1 ... n 為節點組成的二叉搜索樹有多少種?

示例:

這道題要求能構造多少二叉搜索樹。二叉搜索樹是有一定規律的,其中序遍歷是有序的。按照示例所給,可以先從1開始遍歷,看以i為根節點能構造出多少子樹。其實一開始還是沒有什么思路,主要是遞推公式不太好想,所以準備按照五部曲依次思考一下:

  1. 確定dp數組以及下標的含義:dp[i]為有i個節點時能構造的二叉搜索樹個數。
  2. 確定遞推公式:目前還沒有什么思路。
  3. dp數組如何初始化:若n=1,則dp[1]毫無疑問是1,若n=2,則有兩種構造方法,一種是以1為根節點,左子樹為空,右子樹為2;一種是以2為根節點,左子樹為1,右子樹為空,所以dp[2]=2;n=3就是示例中所給情況,可以看到,如果以1為根節點,則左子樹一定為空的,右子樹有兩種可能,分別是以2和3為子樹根節點。若以2為根節點,則左右子樹各有一個節點,有一種可能,若以3為根節點,則右子樹為空,左子樹有兩種可能,分別是以1和2為子樹根節點。

當分析到如何初始化的時候,已經漸漸有了關于推導遞推公式的雛形,接下來可以捋一下思路:

當n=1時:只有一個節點,不附圖了

當n=2時:如下

當n=3時,有三種大的情況:

  1. 以1為根節點:因為此題本質求的是樹的形狀的可能性,所以跟具體的數值關系不大,如果把1去掉來看,可以看到,其實剩下的形狀和n=2的時候是一樣的:
  2. 以2為根節點:左邊節點1,右邊節點3
  3. 以3為根節點:去掉3,剩下的形狀和n=2的時候也是一樣的:

因此

  • 有2個元素的搜索樹數量就是dp[2]。
  • 有1個元素的搜索樹數量就是dp[1]。
  • 有0個元素的搜索樹數量就是dp[0]。

可以這樣推導:

  1. 以1為頭節點的搜索樹個數=右子樹有2個元素搜索樹數量*左子樹有0個元素搜索樹數量
  2. 以2為頭節點的搜索樹個數=右子樹有1個元素搜索樹數量*左子樹有1個元素搜索樹數量
  3. 以3為頭節點的搜索樹個數=右子樹有0個元素搜索樹數量*左子樹有2個元素搜索樹數量

那么n=3時,dp[3]就是上面三種情況的搜索樹個數之和,即dp[3]=dp[2]*dp[0]+dp[1]*dp[1]+dp[0]*dp[2] ,

拓展到i就是:不斷地累加:dp[以j為頭結點左子樹節點數量]*dp[以j為頭結點右子樹節點數量],j的范圍為[1, i]

所以遞推公式為:dp[i]+=dp[j-1]*dp[i-j],因此下面完整的五部曲為:

  1. 確定dp數組以及下標的含義:有i個節點時能構造的二叉搜索樹個數
  2. 確定遞推公式:dp[i]+=dp[j-1]*dp[i-j]
  3. dp數組如何初始化:要注意,從定義上來講,空節點也是一棵二叉樹,也是一棵二叉搜索樹,所以dp[0]=1,這個我一開始弄錯了。dp[1]=1
  4. 確定遍歷順序:i從1到n,j從1到i
  5. 舉例推導dp數組:無法手動舉更多例子
class Solution {/**確定dp數組以及下標的含義:有i個節點時能構造的二叉搜索樹個數確定遞推公式:dp[i]+=dp[j-1]*dp[i-j]dp數組如何初始化:dp[1]=1,dp[2]=2確定遍歷順序:i從3到n,j從1到i*/public int numTrees(int n) {int[] dp=new int[n+1];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];}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717333.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717333.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717333.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何提取圖片中某個位置顏色的RGB值,RGB十進制值與十六進制的轉換

打開本地的畫圖工具&#xff0c;把圖片復制或截圖粘進去&#xff0c;用顏色提取器點對應的位置就可以提取了。 獲取到的 RGB 值為 (66,133,244) 轉化后的值為 #4285F4。 【內容拓展一】&#xff1a;RGB 十進制值與十六進制的轉換 當我們從 RGB 十進制值轉換為十六進制值時&a…

Yapi部署

【GO開發工程師】Yapi部署 推薦個人主頁&#xff1a;席萬里的個人空間 文章目錄 【GO開發工程師】Yapi部署1、Yapi部署 1、Yapi部署 初始化yapi&#xff1a; git clone https://github.com/Ryan-Miao/docker-yapi.git cd docker-yapi docker-compose upyapi啟動失敗 1.cd進入…

粉絲福利-純凈Windows系統安裝鏡像下載網站

?Windows操作系統鏡像文件是從微軟或其他經過驗證的來源下載正版操作系統安裝介質的關鍵所在。以下是詳細闡述從不同渠道獲取Windows系統鏡像的說明,尤其強調官方和安全的下載途徑。Windows系統鏡像可以從多個可靠來源下載,以下是幾個推薦的選擇: 微軟官方網站 微軟官方網…

對于《幻獸帕魯》這樣的游戲,如何優化服務器性能以提高游戲體驗?

對于《幻獸帕魯》這樣的游戲&#xff0c;如何評估和優化服務器性能以提高游戲體驗&#xff1f; 硬件配置優化&#xff1a;選擇高性能的服務器&#xff0c;如4核16G的幻獸帕魯服務器&#xff0c;這樣可以保證有足夠的計算性能和內存容量來支持游戲的運行。同時&#xff0c;考慮到…

Node.js(六)-數據庫與身份認證

一 、學習目標 ◆ 能夠知道如何配置MySQL數據庫環境 ◆ 能夠認識并使用常見的 SQL語操作數據庫 ◆ 能夠在Express中操作MySQL數據庫 ◆ 能夠了解 Session的實現原理 ◆ 能夠了解JWT的實現原理 二、數據庫的基本概念 1.1 什么是數據庫 數據庫&#xff08;database&#xff09;…

邊緣計算網關的重要作用-天拓四方

隨著物聯網技術的迅猛發展&#xff0c;數據量的爆炸式增長對數據處理和分析提出了更高的要求。邊緣計算網關作為連接物理世界和數字世界的橋梁&#xff0c;正逐漸受到各行業的重視。本文將從行業背景、功能特點以及帶來的效益等方面&#xff0c;探討邊緣計算網關在當前及未來的…

備戰藍橋杯---狀態壓縮DP基礎2之TSP問題

先來一個題銜接一下&#xff1a; 與上一題的思路差不多&#xff0c;不過這里有幾點需要注意&#xff1a; 1.因為某一列的狀態還與上上一行有關&#xff0c;因此我們令f[i][j][k]表示第i行狀態為j,第i-1行狀態為k的最大炮兵數。 因此&#xff0c;我們可以得到狀態轉移方程&…

2024/03/01

控制機械臂 #include<myhead.h> #define SER_IP "192.168.126.2" #define SER_PORT 8888#define CLI_IP "192.168.252.165" #define CLI_PORT 9999int main(int argc, const char *argv[]) {int cfdsocket(AF_INET,SOCK_STREAM,0);if(cfd-1){perror…

成功解決git clone遇到的error: RPC failed; curl 16 Error in the HTTP2 framing layer fatal: expected flush af

成功解決git clone遇到的error: RPC failed; curl 16 Error in the HTTP2 framing layer fatal: expected flush af 問題描述解決方案 問題描述 用git的時候可能會遇到這個問題&#xff1a; (base) zhouzikang7443-8x4090-120:~/project$ git clone https://github.com/123/12…

Windows服務器:通過nginx反向代理配置HTTPS、安裝SSL證書

先看下效果&#xff1a; 原來的是 http&#xff0c;配置好后 https 也能用了&#xff0c;并且顯示為安全鏈接。 首先需要 SSL證書 。 SSL 證書是跟域名綁定的&#xff0c;還有有效期。 windows 下雙擊可以查看相關信息。 下載的證書是分 Apache、IIS、Tomcat 和 Nginx 的。 我…

【leetcode】圓圈中最后剩下的數字

目錄 1. 問題 2. 思路 3. 代碼 4. 運行 1. 問題 本題即為典型的約瑟夫問題&#xff0c;通過遞推公式倒推出問題的解。原始問題是從n個人中每隔m個數踢出一個人&#xff0c;原始問題變成從n-1個人中每隔m個數踢出一個人…… 示例 1&#xff1a; 輸入: n 5, m 3 輸出: 3…

Unity TMP文字移動效果

前言 看見很多游戲有很特殊的波浪形文字效果&#xff0c;于是來嘗試一下控制TMP文字頂點的方式達到類似效果。 原理 掛載tmp text&#xff0c;在里面隨便放入非空格字符。 tmp text組件開放了textInfo接口&#xff0c;也就是GetComponent<TextMeshProUGUI>().textInfo…

兩天學會微服務網關Gateway-Gateway簡介

鋒哥原創的微服務網關Gateway視頻教程&#xff1a; Gateway微服務網關視頻教程&#xff08;無廢話版&#xff09;_嗶哩嗶哩_bilibiliGateway微服務網關視頻教程&#xff08;無廢話版&#xff09;共計17條視頻&#xff0c;包括&#xff1a;1_Gateway簡介、2_Gateway工作原理、3…

使用.NET開發VSTO工具快速將PPT導出為圖片

本文主要介紹如何使用.NET開發 PowerPoint VSTO 外接程序&#xff0c;并實現快速的將當前頁PPT導出為圖片的功能。可以幫助你了解如何使用 VSTO 開發 Office 外接程序&#xff0c;以及如何操作 PowerPoint 的對象模型。 1. 背景 在日常的文章寫作中&#xff0c;我經常使用 PPT…

Vue 3 中的 watchEffect 和 watch 有什么區別?

Vue 3 中的 watchEffect 和 watch 有什么區別&#xff1f; Vue 3 引入了 Composition API&#xff0c;為開發者提供了更加靈活和組織化的方式來組合和復用代碼邏輯。在響應式系統中&#xff0c;watch 和 watchEffect 是兩個重要的函數&#xff0c;用于觀察和響應 Vue 組件中狀…

JUC并發編程 深入學習Java并發編程【上】

JUC并發編程&#xff0c;深入學習Java并發編程&#xff0c;與視頻每一P對應&#xff0c;全系列6w字。 P1-5 為什么學特色預備知識 進程線程概念 進程&#xff1a; 一個程序被運行&#xff0c;從磁盤加載這個程序的代碼到內存&#xff0c;就開起了一個進程。 進程可以視為程…

JVM相關問題

JVM相關問題 一、Java繼承時父子類的初始化順序是怎樣的&#xff1f;二、JVM類加載的雙親委派模型&#xff1f;三、JDK為什么要設計雙親委派模型&#xff0c;有什么好處&#xff1f;四、可以打破JVM雙親委派模型嗎&#xff1f;如何打破JVM雙親委派模型&#xff1f;五、什么是內…

Spring Cloud Gateway-系統保護Sentinel集成

文章目錄 Sentinel介紹Spring Cloud Gateway集成Sentinelpom依賴Sentinel配置Sentinel集成Nacos作為數據源自定義降級響應 Sentinel介紹 ? 隨著微服務的流行&#xff0c;服務和服務之間的穩定性變得越來越重要。Sentinel 是面向分布式、多語言異構化服務架構的流量治理組件&a…

HTML5:七天學會基礎動畫網頁6

CSS3自定義字體 ①&#xff1a;首先需要下載所需字體 ②&#xff1a;把下載字體文件放入 font文件夾里&#xff0c;建議font文件夾與 css 和 image文件夾平級 ③&#xff1a;引入字體&#xff0c;可直接在html文件里用font-face引入字體&#xff0c;分別是字體名字和路徑 例…

Django官網項目

項目準備 使用VSCODE做IDE。 檢查Python版本。 sudo apt install sudo apt update python3 --version創建項目路徑&#xff0c;創建虛擬環境&#xff0c;創建項目 路徑 \mysite 進入路徑&#xff0c;運行VSCODE 運行 "code ." 創建虛擬環境。 選擇 >python: c…