算法| 动态规划dp

  • 221.最大正方形
  • 1143.最长公共子序列---1

221.最大正方形

clike 复制代码
/**
 * @param {character[][]} matrix
 * @return {number}
 */
// 思路
// dp初始化
// dp[i][j] 含义: 左 上  左上取 最小值  最后再加1
var maximalSquare = function (matrix) {
  const m = matrix.length;
  const n = matrix[0].length;
  const dp = Array(m)
    .fill(0)
    .map(() => Array(n).fill(0));

  let maxLen = 0;
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (matrix[i][j] === "1") {
        if (i === 0 || j == 0) {
          dp[i][j] = 1;
        } else {
          dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1;
        }
        maxLen = Math.max(maxLen, dp[i][j]);
      }
    }
  }
  //   console.log(maxLen * maxLen);
  return maxLen * maxLen;
};

maximalSquare([
  ["1", "0", "1", "0", "0"],
  ["1", "0", "1", "1", "1"],
  ["1", "1", "1", "1", "1"],
  ["1", "0", "0", "1", "0"],
]);

1143.最长公共子序列---1

clike 复制代码
/**
 * @param {string} text1
 * @param {string} text2
 * @return {number}
 */
// 思路
// 构建dp 好像字符串比较是否相同 都是m+1 n+1 ,多一个,
// 双for循环时 s1取在第一个for之后取值 s2在第二个for里取值 ,都取前一个i-1 或者j-1
// dp[i][j]取值:相等时取左上角  不相等时取左或者上的最大值
// 返回结果
var longestCommonSubsequence = function (text1, text2) {
  const m = text1.length;
  const n = text2.length;

  const dp = Array(m + 1)
    .fill(0)
    .map(() => Array(n + 1).fill(0));

  for (let i = 1; i <= m; i++) {
    const s1 = text1[i - 1];
    for (let j = 1; j <= n; j++) {
      const s2 = text2[j - 1];
      if (s1 === s2) {
        dp[i][j] = dp[i - 1][j - 1] + 1;
      } else {
        dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
      }
    }
  }
  //   console.table(dp);
  return dp[m][n];
};

longestCommonSubsequence("abcde", "ace");
// ┌─────────┬───┬───┬───┬───┐
// │ (index) │ 0 │ 1 │ 2 │ 3 │
// ├─────────┼───┼───┼───┼───┤
// │    0    │ 0 │ 0 │ 0 │ 0 │
// │    1    │ 0 │ 1 │ 1 │ 1 │
// │    2    │ 0 │ 1 │ 1 │ 1 │
// │    3    │ 0 │ 1 │ 2 │ 2 │
// │    4    │ 0 │ 1 │ 2 │ 2 │
// │    5    │ 0 │ 1 │ 2 │ 3 │
// └─────────┴───┴───┴───┴───┘
相关推荐
智者知已应修善业13 分钟前
【求等差数列个数/无序获取最大最小次大次小】2024-3-8
c语言·c++·经验分享·笔记·算法
LYFlied30 分钟前
【每日算法】LeetCode 416. 分割等和子集(动态规划)
数据结构·算法·leetcode·职场和发展·动态规划
多米Domi0111 小时前
0x3f 第19天 javase黑马81-87 ,三更1-23 hot100子串
python·算法·leetcode·散列表
历程里程碑1 小时前
滑动窗口最大值:单调队列高效解法
数据结构·算法·leetcode
課代表1 小时前
从初等数学到高等数学
算法·微积分·函数·极限·导数·积分·方程
ullio1 小时前
arc206d - LIS ∩ LDS
算法
等等小何2 小时前
leetcode1593拆分字符串使唯一子字符串数目最大
算法
王老师青少年编程3 小时前
2025年12月GESP(C++二级): 环保能量球
c++·算法·gesp·csp·信奥赛·二级·环保能量球
weixin_433417673 小时前
Canny边缘检测算法原理与实现
python·opencv·算法
CoderCodingNo3 小时前
【GESP】C++五级真题(贪心思想考点) luogu-P11960 [GESP202503 五级] 平均分配
开发语言·c++·算法