当前位置: 首页 > news >正文

子序列问题写法

子序列问题可以按照动态规划的思想去写。

子序列问题类型

子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。

例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

写法思路

创建两层for循环,外层为for(int i=0;i<n;i++);内层为for(int j=0;j<i;j++)。

然后就写转移方程即可。

例题:NO.300. 最长递增子序列

题目:

链接:

https://leetcode.cn/problems/longest-increasing-subsequence/description/

代码:

class Solution {
    // 状态表示: 以i结束的序列,最长严格递增序列的长度;            
    public int lengthOfLIS(int[] nums) {
        int n=nums.length;
        int[] dp=new int[n];
         // 初始化:
        for(int i=0;i<n;i++) dp[i]=1;
        int ret=1;
        for(int i=0;i<n;i++){
            for(int j=0;j<i;j++){
                // 转移方程:
                if(nums[i]>nums[j]){
                    dp[i]=Math.max(dp[i],dp[j]+1);
                }
            }
            ret=Math.max(ret,dp[i]);
        }
        return ret;
    }
}

状态表示:

  以i结束的序列,最长严格递增序列的长度;

转移方程:

     长度为1时,dp[i]=1;

     长度大于1时,满足(nums[i]>nums[j],则dp[i]=Math.max(dp[i],dp[j]+1);

初始化:

     因为长度>=1,所以每一个以i结尾的序列,最小长度为1,于是令全数组长度为1.

填表顺序: 

     从左往右依次填写。

总结:

子序列问题包含子数组问题,这类问题是动态规划的一种形式(当然也可以用其他方法写),只不过是变成了双层for循环。

相关文章:

  • 【嵌入式】复刻SQFMI开源的Watchy墨水屏电子表——(1)硬件部分
  • 方法的使用
  • 破解企业内部盗版软件管理难题的技术方案
  • LeetCode[206]反转链表
  • 51单片机指令系统入门
  • 深入理解蒸馏、Function Call、React、Prompt 与 Agent
  • 【白话神经网络(二)】矩阵、CNN、RNN
  • 【CF】Day9——Codeforces Round 953 (Div. 2) BCD
  • [OpenGL]使用OpenGL实现基于物理的渲染模型PBR(中)
  • 多模态模型Orpheus,基于病理图像的乳腺癌复发风险智能评估工具|顶刊解读·25-03-17
  • Muon: An optimizer for hidden layers in neural networks
  • java学习总结:JSP、Servlet
  • 【云原生之kubernetes实战】在k8s环境中部署OnlyOffice办公套件
  • 深入理解MySQL数据库索引
  • ONENET数据可视化命令框下发命令使用
  • 一文掌握 PostgreSQL 的各种指令(PostgreSQL指令备忘)
  • iptables与firewall的区别,从不同的角度讲解
  • IP关联是什么?怎么避免?
  • [算法] 贪心--矩阵消除游戏
  • 车载DoIP测试 --- CANoe DoIP中如何配置路由激活请求中的 OEM 特定场(RoutingActivationWithOEMSpecific)
  • 高适配算力、行业大模型与智能体平台重塑工业城市
  • 山西省委常委李金科添新职
  • 男子发寻母视频被警方批评教育,律师:发寻亲信息是正当行为
  • 火车站员工迟到,致出站门未及时开启乘客被困?铁路部门致歉
  • 美国“贸易战”前线的本土受害者:安静的洛杉矶港和准备关门的小公司
  • 欧阳娜娜担任江西吉安文化旅游大使