GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — 一和零-474 · Issue #86 · sl1673495/leetcode-javascript Open Labels Description在计算机界中,我们总是追求用有限的资源获取最大的收益。 现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。 你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。 注意: 给定 0 和 1 的数量都不会超过 100。 来源:力扣(LeetCode) 思路直接转载 liweiwei大佬的题解 吧,讲的很好了。 思路:把总共的 思路依然是“一个一个尝试,容量一点一点尝试”,每个物品分类讨论:选与不选。 第 1 步:定义状态依然是尝试「题目问啥,就把啥定义成状态」。 第 2 步:状态转移方程dp[i][j][k]= max( // 不选择当前字符串 dp[i][j][k - 1], // 选择了当前字符串,用减掉可用个数后并且不能选择当前字符时的最优解 dp[i - 当前字符使用 0 的个数][j - 当前字符使用 1 的个数][k - 1] ) 第 3 步:输出输出是最后一个状态,即: 作者:liweiwei1419 /** * @param {string[]} strs * @param {number} m * @param {number} n * @return {number} */ let findMaxForm = function (strs, m, n) { let sl = strs.length if (!sl) { return 0 } let dp = [] for (let i = 0; i <= m; i++) { dp[i] = [] for (let j = 0; j <= n; j++) { dp[i][j] = [] for (let s = 0; s < sl; s++) { let str = strs[s] let [strM, strN] = countMAndN(str) let pickOnlyPrev = dp[i][j][s - 1] || 0 let pickCurAndPrev = 0 if (i >= strM && j >= strN) { pickCurAndPrev = 1 + (dp[i - strM][j - strN][s - 1] || 0) } dp[i][j][s] = Math.max(pickCurAndPrev, pickOnlyPrev) } } } return dp[m][n][sl - 1] } function countMAndN(str) { let m = 0 let n = 0 for (let i = 0; i < str.length; i++) { if (str[i] === "0") { m++ } else { n++ } } return [m, n] } ActivityMetadataMetadataAssigneesLabelsProjectsMilestoneRelationshipsDevelopmentIssue actions |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |