LeetCode 474 一和零(動態規劃)

2021-10-10 14:45:22 字數 1094 閱讀 1429

給你乙個二進位制字串陣列 strs 和兩個整數 m 和 n 。請你找出並返回 strs 的最大子集的大小,該子集中 最多 有 m 個 0 和 n 個 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

示例 1:

輸入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3

輸出:4

解釋:最多有 5 個 0 和 3 個 1 的最大子集是 ,因此答案是 4 。

其他滿足題意但較小的子集包括 和 。 不滿足題意,因為它含 4 個 1 ,大於 n 的值 3 。

示例 2:

輸入:strs = ["10", "0", "1"], m = 1, n = 1

輸出:2

解釋:最大的子集是 ,所以答案是 2 。

1 <= strs.length <= 600

1 <= strs[i].length <= 100

strs[i] 僅由 '0' 和 '1' 組成

1 <= m, n <= 100

採用動態的規劃的方法解決問題。具體思路如下:

(1)因為要考慮0和1的個數,所以需要建立乙個二維的狀態陣列進行記錄,dp[i][j]代表0的容量為i,1的容量為j時,最大子集的元素個數。

(2)對每乙個元素進行遍歷,判斷其包含的0和1的個數,能否放入不同狀態的dp[i][j]中。

(3)給定集合中的每個元素str都可以選擇裝入子集或者不裝入子集,如果不裝入子集則dp[i][j]的結果不變,如果裝入則dp[i][j]=max(dp[i][j], dp[i - strcountzeros][j - strcountones] + 1)。

(4)因為每個元素只能選擇一次,不能重複使用,所以需要m和n從大到小遍歷。

leetcode 474 一和零 擊敗99 3

在計算機界中,我們總是追求用有限的資源獲取最大的收益。現在,假設你分別支配著 m 個 0 和 n 個 1。另外,還有乙個僅包含 0 和 1 字串的陣列。你的任務是使用給定的 m 個 0 和 n 個 1 找到能拼出存在於陣列中的字串的最大數量。每個 0 和 1 至多被使用一次。注意 給定 0 和 1 ...

動態規劃 leetcode 474 一和零

題目 給你乙個二進位制字串陣列 strs 和兩個整數 m 和 n 請你找出並返回 strs 的最大子集的大小,該子集中 最多 有 m 個 0 和 n 個 1 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 思路 動態規劃,類似0 1揹包問題。選擇 每個字串,要麼選,要麼不選 狀...

01揹包問題之LeetCode474一和零詳解

題目 有n件物品和一個容量為v的揹包。第i件物品的費用是w i 價值是v i 求將哪些物品裝入揹包可使價值總和最大。基本思路 01揹包的特點有兩個 乙個是每件物品有且只有乙個,二是每個物品可以選擇放或者不放。一般狀態轉移方程定義為 dp i j max dp i 1 j dp i 1 j w i v...