力扣150题——多维动态规划

交错字符串

题目

97. 交错字符串 - 力扣(LeetCode)

思路

用dpij代表s1的前i个字母和s2的前j个字母能否交错组成s3的前i+j-1的子串

状态转移方程即为

  • 如果 s1i-1 == s3i + j - 1,并且 dpi-1j 为 true,则 dpij 也为 true。
  • 如果 s2j-1 == s3i + j - 1,并且 dpij-1 为 true,则 dpij 也为 true。

代码

java 复制代码
public boolean isInterleave(String s1, String s2, String s3) {
        int n=s1.length(),m=s2.length(),l=s3.length();
        if(n+m!=l){
            return false;
        }
        boolean[][] dp = new boolean[n+1][m+1];
        dp[0][0] = true;
        for(int i=1;i<=n;i++){
            dp[i][0]=dp[i-1][0]&&s1.charAt(i-1)==s3.charAt(i-1);
        }
        for(int i=1;i<=m;i++){
            dp[0][i]=dp[0][i-1]&&s2.charAt(i-1)==s3.charAt(i-1);
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(dp[i-1][j]&&s1.charAt(i-1)==s3.charAt(i+j-1)){
                    dp[i][j]=true;
                }else if(dp[i][j-1]&&s2.charAt(j-1)==s3.charAt(i+j-1)){
                    dp[i][j]=true;
                }
            }
        }
        return dp[n][m];
    }

买卖股票的最佳时机Ⅲ

题目

123. 买卖股票的最佳时机 III - 力扣(LeetCode)

思路

  • 设 dpij0 表示第 i 天,最多进行 j 次交易,并且当前不持有股票的最大利润。
  • 设 dpij1 表示第 i 天,最多进行 j 次交易,并且当前持有股票的最大利润。

状态转移方程:

  • dpik0 = max(dpi-1j0, dpi-1j1 + pricesi)
    • 即今天不持有股票有两种情况:
    • 昨天也不持有股票,或者
    • 昨天持有股票,今天卖出股票。
  • dpik1 = max(dpi-1j1, dpi-1j-10 - pricesi)
    • 即今天持有股票也有两种情况:
    • 昨天也持有股票,或者
    • 昨天不持有股票,今天买入股票。

代码

java 复制代码
public int maxProfit(int[] prices) {
        int n = prices.length;
        if(n==0){
            return 0;
        }
        int[][][] dp = new int[n][3][2];
       for(int i=0;i<3;i++){
           dp[0][i][0]=0;
           dp[0][i][1]=-prices[0];
       }

       for(int i=1;i<n;i++){
           for(int j=1;j<3;j++){
               dp[i][j][0]=Math.max(dp[i-1][j][0],dp[i-1][j][1]+prices[i]);
               dp[i][j][1]=Math.max(dp[i-1][j][1],dp[i-1][j-1][0]-prices[i]);
           }
       }
       return dp[n-1][2][0];
    }

买卖股票的最佳时机Ⅳ

题目

188. 买卖股票的最佳时机 IV - 力扣(LeetCode)

思路

只需要在上一题的基础上讲k的值化为动态的,并且最后遍历所有的K,找出能达到最大利益的K,并返回最大值。

代码

java 复制代码
public int maxProfit(int k, int[] prices) {
        int n = prices.length;
        if(n==0||k==0){
            return 0;
        }
        int[][][] dp = new int[n][k+1][2];
        for(int i=0;i<=k;i++){
            dp[0][i][0]=0;
            dp[0][i][1]=-prices[0];
        }

        for(int i=1;i<n;i++){
            for(int j=1;j<=k;j++){
                dp[i][j][0]=Math.max(dp[i-1][j][0],dp[i-1][j][1]+prices[i]);
                dp[i][j][1]=Math.max(dp[i-1][j][1],dp[i-1][j-1][0]-prices[i]);
            }
        }
        int max = Integer.MIN_VALUE;
        for(int i=0;i<=k;i++){
            max = Math.max(dp[n-1][i][0],max);
        }
        return max;
    }

最大正方形

题目

221. 最大正方形 - 力扣(LeetCode)

思路

  • dp[i][j] 表示以位置 (i, j) 作为正方形右下角的最大正方形的边长。
  • 若 matrixij == '1',则 dpij 的值由 dpi-1j(上)、dpij-1(左)和 dpi-1j-1(左上)的最小值加1决定。

代码

java 复制代码
public int maximalSquare(char[][] matrix) {
        int n = matrix.length;
        if(n==0){
            return 0;
        }
        int m = matrix[0].length;
        int[][] dp = new int[n][m];
        int max = Integer.MIN_VALUE;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;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],Math.min(dp[i-1][j-1],dp[i][j-1]))+1;
                    }
                    max = Math.max(max,dp[i][j]);
                }
            }
        }
        return max*max;
    }
相关推荐
JieE2121 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2122 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack202 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2123 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2123 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术3 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050733 天前
(一)小红的数组操作
算法·编程语言