LeetCode Hot100(多维动态规划)

62. 不同路径

比较板子的dp,实际上就是到达一个点有两种方式,从上面来或者是左边,加起来就可以了

复制代码
class Solution {
    public int uniquePaths(int m, int n) {
        int [][]arr = new int[m+2][n+2];
        arr[1][1]=1;
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(i==1&&j==1){
                    continue;
                }
                arr[i][j]+=arr[i-1][j]+arr[i][j-1];
            }
        }
        return arr[m][n];
    }
}

64. 最小路径和

跟上一题一样,该题取一下最小值即可

复制代码
class Solution {
    public int minPathSum(int[][] grid) {
        if(grid.length==0){
            return 0;
        }
        for(int i=0;i<grid.length ; i ++){
            for(int j=0;j<grid[i].length;j++){
                if(i>0&&j>0){
                    grid[i][j]+=Math.min(grid[i-1][j],grid[i][j-1]);
                }
                else if(i==0){
                    if(j>0){
                        grid[i][j]+=grid[i][j-1];
                    }
                }else if(j==0){
                    if(i>0){
                        grid[i][j]+=grid[i-1][j];
                    }
                }
            }
        }
        return grid[grid.length-1][grid[grid.length-1].length-1];
    }
}

5. 最长回文子串

这边直接采取的暴力的做法,枚举每一个字符串,看看是不是回文的即可

复制代码
class Solution {
    public static String longestPalindrome(String s) {
        int wei=0;
        int len=1;
        char []arr=s.toCharArray();
        for(int i=0;i<arr.length;i++){
            for(int j=i;j<arr.length;j++){
                int f=(j-i);
                int mark=0;
                for(int p=0;p<=f;p++){
                    if(arr[i+p]!=arr[j-p]){
                        mark=1;
                        break;
                    }
                }
                if(mark==0){
                    if(j-i+1>=len){
                        len=j-i+1;
                        wei=i;
                    }
                }
            }
        }

        String s2=s.substring(wei,wei+len);
       
        return s2;
    }
}

1143. 最长公共子序列

也算是比较板子的dp了,我们设dp[i][j]为以i和j为结尾的最长子序列,它实际上有两种可能,一个是i和j对应的字符相等,那么直接就是i-1,j-1加1即可,如果不同,就是i-1,j,或者i,j-1转移过来即可

复制代码
class Solution {
    public static void main(String[] args) {

        longestCommonSubsequence("abcde","ace");
    }
    public static int longestCommonSubsequence(String text1, String text2) {
        int len=0;
        char []s2=text2.toCharArray();
        char []s1=text1.toCharArray();
        int [][]dp=new int[text1.length()][text2.length()];
        int maxx=0;
        for(int i=0;i<s1.length;i++){
            for(int j=0;j<s2.length;j++){
                if(s1[i]==s2[j]){
                    if(i>=1&&j>=1){
                        dp[i][j]=Math.max(dp[i-1][j-1]+1,dp[i][j]);
                    }
                    else{
                        dp[i][j]=1;
                    }
                }
                else{
                    if(i>=1){
                        dp[i][j]=Math.max(dp[i-1][j],dp[i][j]);
                    }
                    if(j>=1){
                        dp[i][j]=Math.max(dp[i][j-1],dp[i][j]);
                    }
                }
                maxx=Math.max(dp[i][j],maxx);
            }
        }

        

        return maxx;
    }

}

72. 编辑距离

与上一题几乎一致,看一下代码即可

java 复制代码
import java.util.*;

import static java.util.Collections.reverse;

public class Main {
    public static void main(String[] args) {

        minDistance("abcde","ace");
    }
    public static int minDistance(String word1, String word2) {
        int len1 = word1.length(), len2 = word2.length();
        int[][] dp = new int[len1 + 1][len2 + 1];
        for (int i = 0; i < len1; i++)
            dp[i + 1][0] = i + 1;
        for (int i = 0; i < len2; i++)
            dp[0][i + 1] = i + 1;
        for (int i = 0; i < len1; i++) {
            for (int j = 0; j < len2; j++) {
                dp[i + 1][j + 1] = word1.charAt(i) == word2.charAt(j) ? dp[i][j]
                        : Math.min(Math.min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1;
            }
        }
        return dp[len1][len2];
    }



}
相关推荐
TechCampus5 分钟前
小红书面试中我这样解释 KMP,面试官点头了
算法
Youndry7 分钟前
验证二叉搜索树
算法
Spider_Man10 分钟前
从 "字符拼图" 到 "文字魔术":动态规划玩转字符串变形术
javascript·算法·leetcode
玄妙尽在颠倒间28 分钟前
雪花算法:从 64 位到 128 位 —— 超大规模分布式 ID 生成器的设计与实现
后端·算法
Star在努力1 小时前
15-C语言:第15~16天笔记
c语言·笔记·算法
CoovallyAIHub1 小时前
工业质检新突破!YOLO-pdd多尺度PCB缺陷检测算法实现99%高精度
深度学习·算法·计算机视觉
gb42152871 小时前
负载均衡算法中的加权随机算法
windows·算法·负载均衡
xdlka2 小时前
C++初学者4——标准数据类型
开发语言·c++·算法
go54631584652 小时前
大规模矩阵构建与高级算法应用
线性代数·算法·矩阵
向左转, 向右走ˉ2 小时前
为什么分类任务偏爱交叉熵?MSE 为何折戟?
人工智能·深度学习·算法·机器学习·分类·数据挖掘