算法笔记|Day37动态规划X

算法笔记|Day37动态规划X

  • [☆☆☆☆☆leetcode 300.最长递增子序列](#☆☆☆☆☆leetcode 300.最长递增子序列)
  • [☆☆☆☆☆leetcode 674. 最长连续递增序列](#☆☆☆☆☆leetcode 674. 最长连续递增序列)
  • [☆☆☆☆☆leetcode 718. 最长重复子数组](#☆☆☆☆☆leetcode 718. 最长重复子数组)

☆☆☆☆☆leetcode 300.最长递增子序列

题目链接:leetcode 300.最长递增子序列

题目分析

1.dp数组含义:dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度,取所有dp[i]中的最大值即为所求最长递增子序列的长度;

2.递推公式:if(nums[i]>nums[j])dp[i]=Math.max(dp[j]+1,dp[i])(如果遍历j从0到i-1,对所有满足nums[i]>nums[j]的j取dp[j]+1的最大值);

3.初始化:所有dp[i]=1(每一个i最长递增子序列大小至少都是1);

4.遍历顺序:从小到大。

代码

java 复制代码
class Solution {
    public int lengthOfLIS(int[] nums) {
        int dp[]=new int[nums.length];
        int res=1;
        for(int i=0;i<nums.length;i++)
            dp[i]=1;
        for(int i=0;i<nums.length;i++){
            for(int j=0;j<i;j++){
                if(nums[i]>nums[j])
                    dp[i]=Math.max(dp[j]+1,dp[i]);
                res=Math.max(dp[i],res);
            }
        }
        return res;
    }
}

☆☆☆☆☆leetcode 674. 最长连续递增序列

题目链接:leetcode 674. 最长连续递增序列

题目分析

1.dp数组含义:dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度,取所有dp[i]中的最大值即为所求最长连续递增序列的长度;

2.递推公式:if(nums[i]>nums[i-1])dp[i]=dp[i-1]+1(如果nums[i]>nums[i-1],则取dp[i-1]+1);

3.初始化:所有dp[i]=1(每一个i最长递增子序列大小至少都是1);

4.遍历顺序:从小到大。

代码

java 复制代码
class Solution {
    public int findLengthOfLCIS(int[] nums) {
        int dp[]=new int[nums.length];
        int res=1;
        for(int i=0;i<nums.length;i++)
            dp[i]=1;
        for(int i=1;i<nums.length;i++){
            if(nums[i]>nums[i-1])
                dp[i]=dp[i-1]+1;
            res=Math.max(dp[i],res);
        }
        return res;
    }
}

☆☆☆☆☆leetcode 718. 最长重复子数组

题目链接:leetcode 718. 最长重复子数组

题目分析

1.dp数组含义:dp[i][j]表示以nums1[i-1]和nums2[j-1]为结尾的最长重复子数组长度,取所有dp[i][j]中的最大值即为所求最长重复子数组的长度;

2.递推公式:if(nums1[i-1]==nums2[j-1])dp[i][j]=dp[i-1][j-1]+1(如果结尾元素相等,dp[i][j]在dp[i-1][j-1]的基础上加一);

3.初始化:所有dp[i][0]=0,所有dp[0][j]=0;

4.遍历顺序:从小到大。

代码

java 复制代码
class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int dp[][]=new int[nums1.length+1][nums2.length+1];
        int res=0;
        for(int i=1;i<=nums1.length;i++){
            for(int j=1;j<=nums2.length;j++){
                if(nums1[i-1]==nums2[j-1])
                    dp[i][j]=dp[i-1][j-1]+1;
                res=Math.max(dp[i][j],res);
            }
        }
        return res;
    }
}
相关推荐
算AI5 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
hyshhhh7 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
杉之8 小时前
选择排序笔记
java·算法·排序算法
吴梓穆8 小时前
UE5学习笔记 FPS游戏制作38 继承标准UI
笔记·学习·ue5
烂蜻蜓8 小时前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法
OYangxf8 小时前
图论----拓扑排序
算法·图论
我要昵称干什么8 小时前
基于S函数的simulink仿真
人工智能·算法
AndrewHZ8 小时前
【图像处理基石】什么是tone mapping?
图像处理·人工智能·算法·计算机视觉·hdr
念九_ysl8 小时前
基数排序算法解析与TypeScript实现
前端·算法·typescript·排序算法
守正出琦8 小时前
日期类的实现
数据结构·c++·算法