写在前面

继续接着来写今天的动态规划系列

今天带来子序列相关的两道题,一起拓展动态规划的思路

题目一:最长上升子序列

解题思路

  1. 不再像昨天一样写我们如何找到状态选择的,直接来确定dp数组及其含义。没有那么多道理,你多刷几道题就清楚了。

  2. 首先确定dp [ i ]为以索引为i的元素结尾时,当前截断数组的最长上升子序列的长度。

  3. 那么我们如何确定dp[ i ]和dp[i - 1]之间的关系呢,拆分第一个示例寻找规律

      • 输入: [10,9,2,5,3,7,101,18]
        dp[0] = 1; // 10
        dp[1] = 1; // 9
        dp[2] = 1; // 2
        dp[3] = 2; // 2 5
        dp[4] = 2; // 2 3
        dp[5] = 3; // 2 3 7
        dp[6] = 4; // 2 3 7 101
        dp[7] = 4; // 2 3 7 101
        输出: 4
        
      • 我们要求的是最长上升子序列,也就是说最后拿到dp数组中的最大值返回即可。

    1. 从上述例子我们看出两点

      1. base case为将所有的dp赋值为1,因为至少有一个数单独称为上升子序列。

      2. 我们注意分析dp的变化过程:dp[ i ]表示以当前i索引的数结尾时的最长上升子序列,也就是新加入的状态就是索引为i的这个数,也是如此,我们必须寻求加入这个数和没加入这个数的区别,加入此数时,我们需要找到前面不包括此数的序列中比他小的数,也就是说我们需要遍历之前的所有数,找到比他小的数,找到之后再思考j索引下的数和dp[j]与当前dp[i]的关系,我们可以很容易的想到dp[j]+1 =dp[i],但是我们不能确定这个j索引的数就是比i索引数小的唯一一个数,因此我们需要不断更新这个数值。也就是

        for (int i = 0; i < num.length;i++) {for (int j = 0; j < i; j++) {if (num[j] < num [i]) {dp[i] = Math.max(dp[i],dp[j] + 1);}}
        }
        
      3. 如此这道题也就解决了、

  4. 下面进行代码实现

代码实现

class Solution {public int lengthOfLIS(int[] nums) {int res = 0;int[] dp = new int[nums.length];// base case的情况Arrays.fill(dp, 1);// dp转移过程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[i], dp[j] + 1);}}// 找到res即可for (int i = 0; i < dp.length; i++) {res = Math.max(res, dp[i]);}return res;}
}

题目二:最长公共子序列

解题思路

  1. 不再赘述过程,直接开始dp定义和状态转化关系分析:
  2. dp [i] [j]为text1的前i个字符,和text2的前j个字符为输入的LCS值。
  3. 动态方程为:
    dp [i] [j] = dp [i - 1] [j - 1] + 1
    dp [i] [j] = max(dp [i - 1] [j], dp [i] [j - 1])
  4. 具体为上面的转移情况还是下面的转移情况其实也很清楚:
    • 如果这俩子序列中当前遍历的字符相同,很显然此时将当前字符从两个字符串中都去掉得到的LCS只 比当前多的这个字符时的LCS小1,也就是第一个状态转移方程。
    • 如果不同,那也很简单,不同则需要前移两个字符串之一的指针,要么第一个字符串去掉最后一个, 要么第二个字符串去掉最后一个字符,此时对比他们两者情况下的LCS值,当前情况下的LCS比这两者中大那个LCS大1,如此即可。
  5. 按照以上思路代码实现即可

代码实现

class Solution {public int longestCommonSubsequence(String text1, String text2) {int len1 = text1.length();int len2 = text2.length();// 初始化dp数组记得多扩一组,因为dp[0][0]是不存值的。int[][] dp = new int[len1 + 1][len2 + 1];// 注意我们索引从1开始比较方便些for (int i = 1; i <= len1; i++) {for (int j = 1; j <= len2; 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[len1][len2];}
}

20200708:动态规划复习day02相关推荐

  1. 20200714:动态规划复习day05

    动态规划复习day05 今天继续说股票问题三 题目: 买卖股票的最佳时机Ⅲ 解题思路 同理,我们还是按照老样子走. 先判断状态和选择 状态:今天第i天,我手里是否有股票,以及我卖出过几次股票. 选择: ...

  2. 20200713:动态规划复习day04

    动态规划复习day04 继续说股票问题 题目: 买卖股票的最佳时机Ⅱ 解题思路 首先说明这题在力扣标记为简单的原因,看下面的贪心解法: class Solution {public int maxPr ...

  3. 20200710:动态规划复习day03

    动态规划复习day03 今天来看股票问题1 题目一:买卖股票的最佳时机 解题思路 首先我们想到的不是动态规划的解法,是一个常规思路:找到后面与当前值的差值最大的那个值,即为我们需要找的卖出的day.因 ...

  4. 20200715:动态规划复习day06

    统计全1子矩阵 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 题意很好理解,但是本题的动态规划不是常规思路的,你需要很好的理解题意并仔细分析状态与转移关系,才能定义正确的dp数组以及其dp ...

  5. 动态规划复习-HDU1081

    注意多个测试用例,和poj不一样 注意输出用例结果之间要换行 代码如下: #include int rect[101][101]; int a[101], dp[101]; int n, mx; in ...

  6. 20200707:动态规划专题之不同路径

    动态规划复习day01 动态规划的题目一直是本人的弱项,这周尝试连续7天的动态规划专题,争取做到有的放矢. 不同路径Ⅰ和Ⅱ解析 题目一:不同路径 解题思路 依据动态规划解题的套路思路 确定状态和选择, ...

  7. NOIP复习篇———贪心

    NOIP复习篇---贪心 --------------------------------------------------------------------------------------- ...

  8. 算法设计与分析考前复习

    算法设计与分析考前复习 qiwang的NOJ系统在考前一天崩了,强烈建议开发新OJ 另外,由于以下这些题是我上完数电实验用了下午和晚上时间写的,可能会出一些错. 分治法复习 二分查找 描述 给定一个单 ...

  9. 中级软件设计师知识总结

    文章目录 复习进度 分型 一.面向对象 1 面向对象的概念 面向对象设计原则 2 UML 静态图/结构图包括: 动态图/行为图包括: 3 4 设计模式 设计模式概念 设计模式的分类 创建型模式 结构型 ...

最新文章

  1. Nginx负载均衡与配置Nginx的ssl
  2. 代码实现:键盘录入任意一个年份,判断该年是闰年还是平年
  3. 博士扩招!反正我是你们得不到的学生...
  4. linux下使用lftp的小结
  5. hive实现not in
  6. 关于android开发时,发生Error infalting classa com.baidu.mapapi.map.MapView的解决办法
  7. 控制台无法连接_指挥中心控制台整体解决方案,告别“信息孤岛”
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的企业通用门户网站官网
  9. 2021年黑龙江高考成绩查询,黑龙江省招生考试信息港:2021年黑龙江高考成绩查询入口、查分系统...
  10. 麦克纳姆轮全向移动机器人斜向直线运动分析
  11. 大数据应用需要注意什么问题
  12. Kubernetes 小白学习笔记(31)--kubernetes云原生应用开发-istio架构和安装
  13. STL---字符串使用方法
  14. 学习廖雪峰 Git 总结
  15. 蓝桥杯c语言大一的知识够了吗,参加蓝桥杯后的感受以及个人总结
  16. 安装DL380gen10
  17. 在vue中如何使用umy-ui
  18. Failed to read artifact descriptor for
  19. 前端项目使用阿里巴巴icon font的具体过程
  20. 《C程序设计》读后感

热门文章

  1. 罗永浩将举办「老人与海」发布会;微软疑似遭遇大范围全球宕机;Python 3.9 首个测试版发布 | 极客头条...
  2. 300 秒带你吃透大数据!
  3. 如何停止在技术债上浪费时间?
  4. 华为鸿蒙是物联网操作系统;字节跳动的飞聊被 App Store 下架;FFmpeg 作者编写 JS 引擎 | 极客头条...
  5. 带你吃透分布式的精髓!
  6. 为何优秀的程序员不断离开?| 畅言
  7. 这位曾指责乔布斯的怪老头,推出的AppleScript比Windows还要快!
  8. 泄漏 iOS 关键源码的人,居然是苹果的一个实习生
  9. 果蔬连连看java源代码_《基于Qt的连连看游戏的设计》-毕业论文.doc
  10. python审计运用_用Python来分析审计行业的这10年