首页 > 其他分享 >动态规划-子序列

动态规划-子序列

时间:2022-11-01 13:44:18浏览次数:47  
标签:nums int length 数组 序列 动态 规划 dp

子序列是序列的一部分,元素可以不连续。

子串是字符串的一部分,必须连续。

求子序列的和、连续递增子序列都是经典的一维动态规划问题。

这一类题目都有差不多的思路,我们看案例。

案例1:有一个整数数组 nums ,请你找出一个具有最大和的连续子数组,返回其最大和。子数组是数组中的一个连续部分。

我们假设数组nums长度为n,定义dp[i]为以nums[i]结尾的连续子数组的和,接下来需要考虑dp[i]和dp[i-1]是什么关系?

显而易见,如果dp[i-1]是大于0的,那么

dp[i]=dp[i-1]+nums[i]

如果dp[i-1]<=0,那么nums[i]加上一个负数一定比自己还小,索性不如不加

dp[i]=nums[i]

这样我们就得到了动态转移方程,接下来上代码

public int maxSubArray(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        //定义dp[i]为以nums[i]结尾的子数组的和
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        //最大值未必以最后一个元素结尾,所有需要遍历所有dp元素
        int maxAns = nums[0];
        for (int i = 1; i < nums.length; i++) {
            if (dp[i - 1] > 0) {
                dp[i] = dp[i - 1] + nums[i];
            } else {
                dp[i] = nums[i];
            }
            if (dp[i] > maxAns) {
                maxAns = dp[i];
            }
        }

        return maxAns;
    }

案例2:有一个整数数组 nums ,找到其中最长严格递增子序列的长度。

大家记住,子序列可以是不连续的。

我们假设dp[i]是以nums[i]结尾的递增序列,那么dp[i]和dp[i-1]是什么关系呢?

这个需要分两种情况,如果nums[i]>nums[i-1],那么dp[i]就可以接在dp[i-1]后面,

dp[i]=dp[i-1]+1

因为子序列可以不连续,我们接不上nums[i-1]可以考虑下前面的元素能不能接上。

如果nums[i]>nums[i-2],dp[i]就能接在dp[i-2]后面,dp[i]=dp[i-2]+1

综上所述,dp[i]等于所有比nums[i]的nums[j]对应的dp[j]+1

动态转移方程:

dp[i]=max{dp[j]+1 :nums[i]>nums[j],0<j<i}

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
 int m = text1.length();
        int n = text2.length();
        int[][] dp = new int[m+1][n+1];
        
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (text1.charAt(i-1) == text2.charAt(j-1)) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[m ][n ];
    }
}

 

标签:nums,int,length,数组,序列,动态,规划,dp
From: https://www.cnblogs.com/wangbin2188/p/16847376.html

相关文章

  • 最长不下降子序列(线段树优化dp)
    最长不下降子序列题目大意:给定一个长度为N的整数序列:A\(_{1}\),A\(_{2}\),⋅⋅⋅,A\(_{N}\)。现在你有一次机会,将其中连续的K个数修改成任意一个相同值。请你计......
  • 关于数字孪生,有没有体系化的规划和实现途径?
    数字孪生就是物理实体数字空间的重构,也可以理解为虚拟化,我们在操作数字空间的对象时物理空间的实体对象相应动作,同样物理空间的实体发生状态变化,数字空间的对象相应发生改变......
  • 学习笔记-JAVA反序列化
    JAVA反序列化免责声明本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.简介序列化是让Java对象脱离Java运......
  • 【QT】创建动态链接库及使用
    创建动态链接库创建一个项目选择library的C++库,下一步。选择共享库,输入动态库的名字,选择创建路径,下一步选择编译环境,下一步选择QTCore模块,该模块提供核心的非图......
  • node2_动态路径拼接错误问题
      如果使用相对路径,不在当前目录下通过其他目录来找到这个JS运行就会报错,当我们使用fs模块来操作文件时,我们如果使用相对路径的话,很容易出现路劲动态拼接错误的情况,......
  • Java实现 Serializable 序列化
    深度理解Java实现Serializable序列化概念把对象转换为直接序列的过程叫对象的序列化把字节序列恢复为对象的过程叫对象的反序列化用途对象持久化跨网络数据交换,远程过程调......
  • Unity反序列天气API的JSON
    心知天气:https://www.seniverse.com/JSON:{"results":[{"location":{"id":"C23NB62W20TF","name":"西雅图","country":......
  • PHP反序列化做题方法
    1.简化:把PHP代码复制到编辑器里面,寻找PHP反序列化的魔术方法,然后把不需要的部分删去2.找链子:通过以知的魔术方法,寻找到可以利用的点,然后想办法通过对象与方法的调用执行......
  • vue动态绑定class的几种方式
    开发项目中:vue动态绑定class的几种方式~第一种:(最简单的绑定)1.绑定单个classhtml部分: <div:class="{'active':isActive}"></div>js部分:判断是否绑定一个activedat......
  • 动态规划-路径问题
    动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法,常常适用于有重叠子问题和最优子结构性质的问题,并且记录所有子问题的结果,因此动态规划方法所......