代碼隨想錄算法訓練營第四十天|139.單詞拆分,多重背包,背包問題

139. 單詞拆分 - 力扣(LeetCode)

給你一個字符串?s?和一個字符串列表?wordDict?作為字典。請你判斷是否可以利用字典中出現的單詞拼接出?s?。

注意:不要求字典中出現的單詞全部都使用,并且字典中的單詞可以重復使用。

示例 1:

輸入: s = "leetcode", wordDict = ["leet", "code"]
輸出: true
解釋: 返回 true 因為 "leetcode" 可以由 "leet" 和 "code" 拼接成。

示例 2:

輸入: s = "applepenapple", wordDict = ["apple", "pen"]
輸出: true
解釋: 返回 true 因為 "applepenapple"可以由 "apple" "pen" "apple" 拼接成。注意,你可以重復使用字典中的單詞

思路:完全背包問題,單詞就是物品,字符串s就是背包,單詞能否組成字符串s,就是問物品能不能把背包裝滿。轉換成背包問題有兩個難點:①dp[i]是如何來的,②遍歷順序。

解決:動態規劃五步曲

? ? ? ? 1.確定dp[j]的含義;

????????dp[i] : 字符串長度為i的話,dp[i]為true,表示可以拆分為一個或多個在字典中出現的單詞

? ? ? ? 2.確定dp[j]遞推公式;

? ? ? ? 這里遞推公式好像和之前不同,這里既沒有01背包的價值,又沒有完全背包的組合數量,通過dp[j]的含義我們知道,dp[i]要不就是true,要不就是false,我們要的就是true。

? ? ? ??如果確定dp[j] 是true,且 [j, i] 這個區間的子串出現在字典里,那么dp[i]一定是true。(j < i )。所以遞推公式是 if([j, i] 這個區間的子串出現在字典里 && dp[j]是true) 那么 dp[i] = true。

? ? ? ? 到這里有點懵了,i是字符串長度,那j是什么,j這里其實表示當前遍歷字符串中的位置。

? ? ? ? 舉個例子:s = "leet", wordDict = ["le", "et"]

? ? ? ? i等于1時,j就從0開始,j=0時,截取i-j就是le,發現wordDict中有“le”,所以dp[i]=true。

? ? ? ? 3.確定dp初始化;

? ? ? ? 沒開始前,dp[i]=false,但是從遞推公式中可以看出,dp[i] 的狀態依靠 dp[j]是否為true,那么dp[0]就是遞推的根基,dp[0]一定要為true,否則遞推下去后面都都是false了

? ? ? ? 4.確定遍歷順序;

? ? ? ? 從上面分析可知,隨著字符串長度i增大,依次遍歷,能在wordDict中找到的單詞肯定越多,結果也越有可能是true。,所以本題一定是先遍歷背包,再遍歷物品。

? ? ? ? 舉個例子:拿 s = "applepenapple", wordDict = ["apple", "pen"] 舉例。

????????"apple", "pen" 是物品,那么我們要求 物品的組合一定是 "apple" + "pen" + "apple" 才能組成 "applepenapple"。"apple" + "apple" + "pen" 或者 "pen" + "apple" + "apple" 是不可以的,那么我們就是強調物品之間順序

? ? ? ? 5.舉例推導dp數組。

????????以輸入: s = "leetcode", wordDict = ["leet", "code"]為例,dp狀態如圖:

代碼:這里利用unordered_set判斷是否在wordDict中找到單詞。

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {vector<bool> dp(s.size()+1,false);unordered_set<string> wordSet(wordDict.begin(), wordDict.end());dp[0]=true;for(int i=0;i<=s.size();i++){for(int j=0;j<i;j++){string word = s.substr(j, i - j); //substr(起始位置,截取的個數)if(wordSet.find(word) != wordSet.end()&&dp[j]){//dp[j]表示前j個長度的字符串可以由單詞拼接,并且截取的子字符串在數組中dp[i]=true;}}}return dp[s.size()];}
};

多重背包

????????例題:有N種物品和一個容量為V 的背包。第i種物品最多有Mi件可用,每件耗費的空間是Ci ,價值是Wi 。求解將哪些物品裝入背包可使這些物品的耗費的空間 總和不超過背包容量,且價值總和最大。

????????區別:多重背包和01背包是非常像的,每件物品最多有Mi件可用,把Mi件攤開,其實就是一個01背包問題了。

????????面試基本不會考,了解即可。

背包問題總結

難點:遞推公式和遍歷順序

步驟:

  1. 確定dp數組(dp table)以及下標的含義
  2. 確定遞推公式
  3. dp數組如何初始化
  4. 確定遍歷順序
  5. 舉例推導dp數組

遞推公式總結

? ? ? ? 1.問能否能裝滿背包(或者最多裝多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])

? ? ? ? 2.?問裝滿背包有幾種方法:dp[j] += dp[j - nums[i]]?

? ? ? ? 3.問背包裝滿最大價值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i])

? ? ? ? 4.問裝滿背包所有物品的最小個數:dp[j] = min(dp[j - coins[i]] + 1, dp[j])

遍歷順序總結:

? ? ? ? 1.01背包

? ? ? ? ①二維數組:二維dp數組01背包先遍歷物品還是先遍歷背包都是可以的,且第二層for循環是從小到大遍歷。

? ? ? ? ②一維數組:一維dp數組01背包只能先遍歷物品再遍歷背包容量,且第二層for循環是從大到小遍歷

? ? ? ? 2.完全背包

? ? ? ? ①如果求組合數就是外層for循環遍歷物品,內層for循環遍歷背包。

? ? ? ? ②如果求排列數就是外層for循環遍歷背包,內層for循環遍歷物品。

總結:對于背包問題,其實遞推公式算是容易的,難是難在遍歷順序上,如果把遍歷順序搞透,才算是真正理解了

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

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

相關文章

【Delphi】FMX開發 ios 和 android 異同點(踩坑記)

目錄 一、前言 二、補充下基礎知識 1. APP程序事件&#xff1a;TApplicationEvent 2. APP內置Web服務器或者UDP服務端或者TCP服務端 三、iOS 和 android 平臺的不同點 1. TApplicationEvent的不同點&#xff1a;以下不同點&#xff0c;請仔細閱讀&#xff01; 2. APP內置…

AI 繪畫 | Stable Diffusion 人物換臉

前言 這篇文章教會你如何使用Stable Diffusion WEB UI擴展插件ReActor輕松實現圖片中的人物換臉。ReActor 是 Stable Diffusion WebUI 的擴展,它允許在圖像中非常簡單準確地進行人臉替換(人臉交換)。 安裝環境準備 安裝 Visual Studio 2022(例如,社區版本 - 需要此步驟來…

十八、FreeRTOS之FreeRTOS任務通知

本節需要掌握以下內容&#xff1a; 1、任務通知的簡介&#xff08;了解&#xff09; 2、任務通知值和通知狀態&#xff08;熟悉&#xff09; 3、任務通知相關API函數介紹&#xff08;熟悉&#xff09; 4、任務通知模擬信號量實驗&#xff08;掌握&#xff09; 5、任務通知…

智能無人零售:革新零售消費體驗的未來

智能無人零售&#xff1a;革新零售消費體驗的未來 在當今數字化時代&#xff0c;智能無人零售正以驚人的速度改變著我們的購物方式和消費體驗。這一新興領域的發展&#xff0c;為消費者帶來了前所未有的便利和個性化選擇。 智能無人零售是指利用先進的智能技術和自動化系統&…

【面試題:對象引用在內存中存在何處?基于何種計算機原理獲取對象的值?】

嗨&#xff0c;小伙伴們&#xff01;小米在這里啦&#xff0c;今天給大家分享一個超有趣的話題——面試題&#xff1a;對象引用是存在內存哪&#xff0c;基于什么計算機原理獲取對象的值&#xff1f;廢話不多說&#xff0c;讓我們一起深入了解一下這個充滿技術魅力的問題吧&…

Java 安全框架shiro初探之一

1.Java安全框架除了spring家族另一個就是shiro框架 不過最近還有一個國產框架很好用&#xff1a;Sa-Token 添加鏈接描述&#xff0c;想了解的小伙伴可以去look look shiro 官方文檔 (https://shiro.apache.org/) 1. 學習教程 參考 (https://www.w3cschool.cn/shiro/) Apac…

2024濟南大健康展會,第六屆中國國際健康產業博覽會5月舉辦

大力發展全國健康事業 助力健康中國行動戰略 DJK 2024第6屆中國&#xff08;濟南&#xff09;國際大健康產業博覽會 The 2024 sixth China (Jinan) International Big Health Industry Expo 時間&#xff1a;2024年05月27日—29日 場館&#xff1a;中國濟南黃河國際會展中心 …

java中實現線程池的方式有哪些?

在 Java 中&#xff0c;實現線程池的方式主要有兩種&#xff1a; ThreadPoolExecutor 類&#xff1a; ThreadPoolExecutor 是 Java 提供的靈活、強大的線程池實現類。通過創建 ThreadPoolExecutor 對象&#xff0c;可以自定義線程池的各種參數&#xff0c;包括核心線程數、最大…

JavaScript-節點操作

節點操作 DOM節點 DOM節點&#xff1a;DOM樹里每一個內容都稱之為節點 節點類型&#xff1a; 元素節點 所有的標簽 比如body、divhtml時跟節點 屬性節點 所有的屬性&#xff0c;比如href 文本節點 所有的文本 其他 查找節點 節點的關系&#xff1a;針對的找親戚返回的都是…

java_springboot_ssm流浪寵物救助報名管理系統

用戶&#xff1a; 注冊登錄 寵物百科&#xff1a;提供一些養寵物的專業知識、養寵前的注意事項等等 寵物信息&#xff1a;包括寵物圖片、品種、性別、年齡、疫苗、領取要求等內容 寵物領養&#xff1a;領養人自己的詳細住址、收入情況、有無養過寵物的記錄&#xff08;有則出示…

學習Java第64天,請求轉發和響應重定向

請求轉發和響應重定向 概述 什么是請求轉發和響應重定向 請求轉發和響應重定向是web應用中間接訪問項目資源的兩種手段,也是Servlet控制頁面跳轉的兩種手段 請求轉發通過HttpServletRequest實現,響應重定向通過HttpServletResponse實現 請求轉發生活舉例: 張三找李四借錢,李四…

人工智能原理復習--搜索策略(二)

文章目錄 上一篇啟發式搜索與或圖搜索博弈下一篇 上一篇 人工智能原理復習–搜索策略&#xff08;一&#xff09; 啟發式搜索 提高一般圖搜索效率的關鍵是優化OPEN表中節點的排序方式 最理想的情況是每次排序OPEN表表首n總在解答路徑上 全局排序–對OPEN表中的所有節點進行…

vue實例事件

實例方法 / 事件 vm.$on 監聽當前實例上的自定義事件。事件可以由 vm.$emit 觸發。回調函數會接收所有傳入事件觸發函數的額外參數。 vm.$on(test, function (msg) {console.log(msg) }) vm.$emit(test, hi) // > "hi"vm.$once( event, callback ) 監聽一個自定義…

Vue筆記(二)基本語法

基本語法 <style> table {border-collapse: collapse;margin:0 auto; } strong {color: rgb(235, 51, 100); }td, th {padding-left: 6px; } table tr td:first-child {width:150px } table tr td:nth-child(2) {width:300px } </style> <template><tabl…

mysql面試題——MVCC

一&#xff1a;什么是MVCC&#xff1f; 多版本并發控制&#xff0c;更好的方式去處理讀-寫沖突&#xff0c;就是為了查詢一些正在被另一個事務更新的行&#xff0c;并且可以看到它們被更新之前的值&#xff0c;這樣在做查詢的時候就不用等待另一個事務釋放鎖。 二&#xff1a…

萬界星空科技mes系統中看板管理

我們很多企業現在都有大屏&#xff0c;那到底萬界星空科技低代碼云mes系統管理中看板管理有什么作用&#xff1f;我總結了幾條: 1.提高車間的生產效率 2.有效的監控設備運行狀況 3.控制生產線運行 4.增加和改善用戶體驗 5.提高工作效率和工作安全性

Zabbix監控騰訊云VPC

一、簡介 私有網絡&#xff08;Virtual Private Cloud&#xff0c;VPC&#xff09;是騰訊云上一塊由用戶自定義的邏輯隔離網絡空間&#xff0c;為云服務器、云數據庫等資源提供安全可控的網絡環境。通過構建邏輯隔離的、用戶自定義配置的網絡空間&#xff0c;用戶能夠提升其云…

vue組件插槽

組件的插槽 組件本身就是一個容器&#xff0c;也可以是一個vue對象&#xff0c;也是一個虛擬DOM 普通插槽 組件本身是一個容器&#xff0c;這個容器本身是空的&#xff0c;當我們把需要封裝的html結構裝進去之后&#xff0c;我們可以認為這個容器被塞滿了&#xff0c;那就意…

WIN11家庭中文版使用ENSP+VirtualBox啟動AR失敗40錯誤+未完全關閉hyper-V,以及安裝VirtualBox兼容性問題

使用版本&#xff1a;eNSP 1.3.00.100VirtualBox 5.2.44WinPcap_4_1_3Wireshark最新版。 win11系統最好按照上述版本安裝&#xff0c;VirtualBox不要安裝更高版本&#xff0c;否則可能出現不兼容情況&#xff0c;Wireshark版本要求還好&#xff0c;安裝順序是VirtualBox 5.2.4…

python+pytest接口自動化之參數關聯

什么是參數關聯&#xff1f; 參數關聯&#xff0c;也叫接口關聯&#xff0c;即接口之間存在參數的聯系或依賴。在完成某一功能業務時&#xff0c;有時需要按順序請求多個接口&#xff0c;此時在某些接口之間可能會存在關聯關系。比如&#xff1a;B接口的某個或某些請求參數是通…