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了,我们设dpij为以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];
    }



}
相关推荐
变量未定义~2 小时前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
这就是佬们吗3 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
LONGZETECH3 小时前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车
自学小白菜3 小时前
关于提升机器学习算法做预测回归任务精度的方法分享
算法·机器学习·回归·提升精度
学废了wuwu3 小时前
从入门到实战:深入浅出模型压缩三大核心——剪枝、彩票假设与知识蒸馏
人工智能·算法·剪枝
小肝一下3 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月3 小时前
监督学习算法 之 决策树
学习·算法·决策树
学计算机的计算基3 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana23 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
To_OC11 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode