力扣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;
    }
相关推荐
liulilittle4 小时前
无锁多生产者多消费者队列的工程实现剖析——算法、内存模型与性能
算法·多线程·并发·无锁·mpmc·lock-free
郝学胜-神的一滴4 小时前
力扣 692:巧用小顶堆高效求解前K个高频单词
java·数据结构·python·程序人生·算法·leetcode·职场和发展
科学实验家4 小时前
贪心算法:分饼干
算法·贪心算法
额,不知道写啥。4 小时前
题解:P16710 愿望
数据结构·算法
库玛西4 小时前
快速幂算法全景总结图:从“愚公移山”到“细胞分裂”
c语言·c++·笔记·算法
七号驿栈5 小时前
深入理解 MAC 消息认证算法:原理、分类与应用
算法
bnmoel5 小时前
数据结构深度剖析二叉树・下篇:链式结构的实现 ,遍历方法全解析
c语言·数据结构·算法·二叉树·
豆瓣鸡5 小时前
算法日记 - Day5
java·算法
Accerlator5 小时前
RAG 评测
算法
码哥DFS5 小时前
算法练习day1-备战2027届秋招
前端·javascript·数据结构·算法