474. Ones and Zeroes [JavaScript]

一、解题思路

  这是一道0/1背包的问题,但是相比较普通的背包问题,对于背包的空间由两个维度的数据决定。

  定义状态:

  dp[i][j][k] 表示j个0和k个1在前i个字符串中能够组成字符串的最大个数

  边界状态:

  dp[0][j][k] = 0

  状态转移方程:

  dp[i][j][k] = Math.max(dp[i - 1][j][k], dp[i - 1][j - m1][k - n1] + 1)

二、代码实现

const findMaxForm = (strs, m, n) => {
  const max = strs.length

  const dp = new Array(max + 1)

  dp[0] = new Array(m + 1).fill(0).map(item => {
    return new Array(n + 1).fill(0)
  })

  for (let i = 1; i <= max; i++) {
    dp[i] = []
    // 统计字符串中的 1 和 0
    const [m1, n1] = getInfo(strs[i - 1])
    for (let j = 0; j <= m; j++) {
      dp[i][j] = []
      for (let k = 0; k <= n; k++) {
        dp[i][j][k] = Math.max(0, dp[i - 1][j][k])
        if (m1 <= j && n1 <= k) {
          dp[i][j][k] = Math.max(dp[i][j][k], dp[i - 1][j - m1][k - n1] + 1)
        }
      }
    }
  }

  return dp[max][m][n]
}

function getInfo (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]
}

  
  ----------------------------

关注「漫谈大前端」
不断成长为一名优秀的前端开发工程师

  ----------------------------
  

  您还可以在这些地方找到我:

猜你喜欢

转载自blog.csdn.net/dai_qingyun/article/details/88371358
今日推荐