第四十一天 | 62.不同路徑 63.不同路徑|| 343.整數拆分 96.不同的二叉搜索樹

題目:62.不同路徑

1.二維dp數組dp[i][j]含義:到達(i,j)位置有dp[i][j]種方法。

2.動態轉移方程:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

3.初始化:dp[0][j] = 1, dp[i][0] = 1 (第一行第一列都為1)

4.遍歷順序:從上向下,從左往右

5.打印dp

二維數組怎么定義?

代碼如下:

class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n, 0));for(int i = 0; i < m; i++){dp[i][0] = 1;}for(int j = 0; j < n; j++){dp[0][j] = 1;}for(int i = 1; i < m; i++){for(int j = 1; j < n; j++){dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
};

題目:63.不同路徑||

思路:

1.dp數組及含義:到達(i,j)位置有dp[i][j]種方法。

2.狀態轉移方程:dp[i][j] = dp[i - 1][j] + dp[i][j - 1](遇到空位置才進行計算)

3.初始化:dp[0][j] = 1, dp[i][0] = 1 (第一行第一列都為1)。當遇到障礙后停止。

4.遍歷順序:從上向下,從左往右

5.打印dp

代碼如下:

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {vector<vector<int>> dp(obstacleGrid.size(), vector<int>(obstacleGrid[0].size(), 0));for(int i = 0; i < obstacleGrid.size() && obstacleGrid[i][0] == 0; i++){dp[i][0] = 1;}for(int j = 0; j < obstacleGrid[0].size() && obstacleGrid[0][j] == 0; j++){dp[0][j] = 1;}for(int i = 1; i < obstacleGrid.size(); i++){for(int j = 1; j <obstacleGrid[0].size(); j++){if(obstacleGrid[i][j] == 0){dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}return dp[obstacleGrid.size() - 1][obstacleGrid[0].size() - 1];}
};

題目:343.整數拆分

關鍵在于理解遞推公式。(考慮好有幾個需要比較的情況)

什么時候乘積最大?拆成盡可能相等的數

思路:

1.dp含義:數i經過拆分后,得到最大的乘積dp[i]

2.狀態轉移方程(dp[i] 是依靠 dp[i - j]的狀態):

遞推公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));

? ? ? ? 1)有兩種拆分方式:一是i * (i - j)直接相乘(把 i 拆成兩個數);

????????????????????????????????????二是 j * dp[i - j](把 i 拆成三個數及以上)?????????

? ? ? ? 2)在遞推公式推導的過程中,每次計算dp[i],取最大的而已

? ? ? ? ? ? ? ? 因為在第二層循環中會不斷得到新的dp[i],用本輪for循環得到的dp[i]與之前得到的最大的dp[i]作比較,取更大的。

3.初始化:

拆分0和拆分1的最大乘積是多少?

這是無解的。

這里我只初始化dp[2] = 1,從dp[i]的定義來說,拆分數字2,得到的最大乘積是1,這個沒有任何異議!確定遍歷順序,先來看看遞歸公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));

4.確定遍歷順序:從前到后

確定遍歷順序,先來看看遞歸公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));

dp[i] 是依靠 dp[i - j]的狀態,所以遍歷i一定是從前向后遍歷,先有dp[i - j]再有dp[i]。

5.打印dp數組:

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++){for(int j = 1; j <= i / 2; j++){dp[i] = max(max(j * (i - j), j * dp[i - j]), dp[i]);}}return dp[n];}
};

題目:96.不同的二叉搜索樹

思路:

1.dp數組含義:含有 i 個節點的二叉搜索樹共有dp[i]種

2.狀態轉移方程:

dp[3],就是 元素1為頭結點搜索樹的數量 + 元素2為頭結點搜索樹的數量 + 元素3為頭結點搜索樹的數量

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

元素2為頭結點搜索樹的數量 = 右子樹有1個元素的搜索樹數量 * 左子樹有1個元素的搜索樹數量

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

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

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

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

所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]

所以遞推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 為j為頭結點左子樹節點數量,i-j 為以j為頭結點右子樹節點數量

3.初始化:

初始化,只需要初始化dp[0]就可以了,推導的基礎,都是dp[0]。

那么dp[0]應該是多少呢?

從定義上來講,空節點也是一棵二叉樹,也是一棵二叉搜索樹,這是可以說得通的。

從遞歸公式上來講,dp[以j為頭結點左子樹節點數量] * dp[以j為頭結點右子樹節點數量] 中以j為頭結點左子樹節點數量為0,也需要dp[以j為頭結點左子樹節點數量] = 1, 否則乘法的結果就都變成0了。

4.遍歷順序:左往右

5.打印dp

容易犯得典型錯誤:

class Solution {
public:int numTrees(int n) {vector<int> dp(n + 1, 0);dp[0] = 1;      //易錯:空二叉樹也是二叉搜索樹dp[1] = 1;dp[2] = 2;for(int i = 3; i <= n; i++){      //統計以1,2,...,n為結點有多少種不同的二叉樹for(int j = 1; j <= i; j++){     //統計以1,2,...,i為頭結點,同時共n個節點,有多少種不同的二叉樹dp[i] += dp[j - 1] * dp[i - j]; }}return dp[n];}
};

在初始化時賦值dp[2]等于0,如果題目中n = 1,則會越界。

這一點很容易犯錯

其實經常會有一個困惑,到底初始化時要初始前多少個呢?(手動模擬一下)

正確代碼如下:

class Solution {
public:int integerBreak(int n) {vector<int> dp(n + 1);dp[0] = 0;for(int i = 1; i <= n; i++){for(int j = 1; j <= i / 2; j++){dp[i] = max(max(j * (i - j), j * dp[i - j]), dp[i]);}}return dp[n];}
};

其實只用定義dp[0] = 0,dp[1]往后都是可以動態規劃循環推出來的。

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

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

相關文章

Vue3設置緩存:storage.ts

在vue文件使用&#xff1a; import { Local,Session } from //utils/storage; // Local if (!Local.get(字段名)) Local.set(字段名, 字段的值);// Session Session.getToken()storage.ts文件&#xff1a; import Cookies from js-cookie;/*** window.localStorage 瀏覽器永…

uniapp 安卓 Pc端真機瀏覽器調試

下載插件:真機模擬瀏覽器 1. 安裝, 每次啟用時使用usb 線連接電腦, 并且打開手機或者POS (調試設備)開發者模式, 比如我的是pos 機 則在系統設置中找到版本號,點擊多次就會觸發開發者模式 2.打開真機模擬軟件,打開后會打開一個瀏覽器,如果想要模擬google的瀏覽器則 在瀏覽器地…

精準鍵位提示,鍵盤盲打輕松入門

在說明精準鍵位提示之前&#xff0c;我們先來看一張圖&#xff1a; 這是一張標準的基準鍵位圖&#xff0c;也就是打字時我們雙手的8個手指放在基準鍵位上&#xff0c;在打不同的字母時&#xff0c;我們的手指以基準鍵位為中心&#xff0c;或上、或下、或左、或右&#xff0c;在…

202109青少年軟件編程(Python)等級考試試卷(四級)

第 1 題 【單選題】 執行如下 Python 代碼后, 結果是?( ) def inverse(s,n=0): while s:n = n * 10 + s % 10s = s // 10return nprint

《拯救大學生課設不掛科第二期之Windows11下安裝VC6.0(VC++6.0)與跑通Hello,World!程序教程》【官方筆記】

背景與目標人群&#xff1a; 大學第一次學C語言的時候&#xff0c;大部分老師會選擇VC6這個編輯器。 但由于很多人是新手&#xff0c;第一次上大學學C語言。 老師要求VC6.0&#xff08;VC6.0&#xff09;寫C語言跑程序可能很多人還是第一次接觸電腦。 需要安裝VC6這個編輯器…

Docker常用軟件安裝

文章目錄 1.安裝Tomcat1.docker hub查找鏡像并復制拉取鏡像命令2.拉取鏡像到本地1.執行官網命令2.查看是否拉取成功 3.啟動tomcat4.退出和重啟1.由于是以交互方式啟動的&#xff0c;所以不方便&#xff0c;直接ctrl c退出2.查看當前的容器3.使用docker start 命令啟動容器&…

【cocos creator 】生成六邊形地圖

想要生成一個六邊形組成的地圖 完整代碼示例 以下是完整的代碼示例&#xff0c;包含了注釋來解釋每一步&#xff1a; cc.Class({extends: cc.Component,properties: {hexPrefab: {default: null,type: cc.Prefab},mapWidth: 10, // 網格的寬度&#xff08;六邊形的數量&am…

前端React老項目打包caniuse-lite報錯解決思路

1、下載項目&#xff0c;先更新.npmrc文件&#xff1a; registryhttp://registry.npmmirror.com 2、安裝依賴&#xff0c;本地啟動&#xff0c;運行正常&#xff0c;但直接提交代碼線上打包時會報錯&#xff1a; “ 未找到相關的合并請求。” 打開日志頁面&#xff0c;報錯信息…

【Flutter】線性布局彈性布局層疊布局

&#x1f525; 本文由 程序喵正在路上 原創&#xff0c;CSDN首發&#xff01; &#x1f496; 系列專欄&#xff1a;Flutter學習 &#x1f320; 首發時間&#xff1a;2024年5月25日 &#x1f98b; 歡迎關注&#x1f5b1;點贊&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

4、PHP的xml注入漏洞(xxe)

青少年ctf&#xff1a;PHP的XXE 1、打開網頁是一個PHP版本頁面 2、CTRLf搜索xml&#xff0c;發現2.8.0版本&#xff0c;含有xml漏洞 3、bp抓包 4、使用代碼出發bug GET /simplexml_load_string.php HTTP/1.1 補充&#xff1a; <?xml version"1.0" encoding&quo…

內網穿透--Nps-自定義-上線

免責聲明:本文僅做技術交流與學習... 目錄 Nps項目: 一圖通解: 1-下載nps/npc 2-服務端啟動 訪問web網頁: 添加客戶端&#xff0c;生成密匙. 3-kali客戶端連接服務端 4-添加協議隧道. 5-kali生成后門&#xff1a; 6-kali創建監聽: Nps項目: https://github.com/ehang…

藍橋杯Web開發【模擬題一】15屆

1.動態的Tab欄 日常在使用移動端 APP 或訪問 PC 端網站的時候&#xff0c;常常發現在一些有工具欄或者 Tab 欄的頁面會有頂欄固定的效果。簡單來說&#xff0c;在頁面未開始滾動時頂欄處在其原有的位置上&#xff0c;當頁面向下滾動一定區域后&#xff0c;頂欄會跟隨滾動固定在…

HTTPS證書——網站如何實現HTTPS訪問?

實現網站HTTPS訪問可以簡化為以下四個基本步驟&#xff0c;確保過程既通俗易懂又條理清晰&#xff1a; 1. 申請SSL證書 - 目的&#xff1a;SSL證書是實現HTTPS加密的關鍵&#xff0c;它驗證了網站的身份&#xff0c;并提供了加密數據所需的密鑰。 - 操作&#xff1a;首先&…

超鏈接的魅力:HTML中的 `<a>` 標簽全方位探索!

&#x1f310;超鏈接的魅力&#xff1a;HTML中的 標簽全方位探索&#xff01; &#x1f3de;?基礎營地&#xff1a;認識 <a> 標簽&#x1f6e0;?基本語法&#x1f4da;屬性擴展 &#x1f680;實戰演練&#xff1a;超鏈接的多樣玩法&#x1f308;內鏈與外鏈&#x1f4c…

TypeScript(持續更新中...)

1.TypeScript是什么&#xff1f; TypeScript是javaScript的超集。 2.使用TypeScript 1&#xff09;全局安裝nodejs 2&#xff09;安裝TypeScript編譯器 npm i -g typescript 3.編譯ts文件 //注意&#xff1a;需要在ts文件同級目錄執行此命令&#xff0c;否則會報找不到…

遙感、GIS和GPS技術在水文、氣象、災害、生態、環境及衛生等領域中的應用

【科研必備】遙感、GIS和GPS技術在水文、氣象、災害、生態、環境及衛生等領域中的應用 (qq.com)https://mp.weixin.qq.com/s?__bizMzg2NDYxNjMyNA&mid2247565057&idx4&snecec1f5396132122acf02b188f7b74ac&chksmce6515eaf9129cfc9a6c4a16413c0d746003cc192132…

PostgreSQL 教程

## PostgreSQL 教程 ### 1. PostgreSQL 概述 PostgreSQL 是一個開源的對象關系型數據庫管理系統&#xff08;ORDBMS&#xff09;&#xff0c;以其高擴展性和合規性聞名&#xff0c;支持 SQL 和 JSON 查詢。 ### 2. 安裝與配置 - **下載與安裝**&#xff1a;從 PostgreSQL 官方…

C++ Primer Plus第十七章復習題

1、iostream文件在CI/O中扮演這種角色&#xff1f; 答&#xff1a; iostream文件定義了用于管理輸入和輸出的類、常量和操縱符,這些對象管理用于處理I/O的流和緩沖區。該文件還創建了一些標準對象(cin、cout、cerr和 clog以及對應的寬字符對象)&#xff0c;用于處理與每個程序…

【論文筆記】| 微調LLM晶體生成

【論文筆記】| 微調LLM晶體生成 Fine-Tuned Language Models Generate Stable Inorganic Materials as Text NYU, ICLR 2024 Theme&#xff1a;Material Generation Main work&#xff1a; 微調大型語言模型以生成穩定的材料 可靠性&#xff1a;在樣本結構中&#xff0c;90% …

如何修改WordPress網站的域名

我的網站用的是Hostease的虛擬主機&#xff0c;但是域名是之前在其他平臺買的&#xff0c;而且已經快到期了&#xff0c;因為主機和域名在不同的平臺上&#xff0c;管理不太方便&#xff0c;所以我又在Hostease重新注冊了一個域名&#xff0c;然后把網站換成了新的域名&#xf…