20200708:动态规划复习day02
写在前面
继续接着来写今天的动态规划系列
今天带来子序列相关的两道题,一起拓展动态规划的思路
题目一:最长上升子序列
解题思路
不再像昨天一样写我们如何找到状态选择的,直接来确定dp数组及其含义。没有那么多道理,你多刷几道题就清楚了。
首先确定dp [ i ]为以索引为i的元素结尾时,当前截断数组的最长上升子序列的长度。
那么我们如何确定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数组中的最大值返回即可。
从上述例子我们看出两点
base case为将所有的dp赋值为1,因为至少有一个数单独称为上升子序列。
我们注意分析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);}} }
如此这道题也就解决了、
下面进行代码实现
代码实现
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;}
}
题目二:最长公共子序列
解题思路
- 不再赘述过程,直接开始dp定义和状态转化关系分析:
- dp [i] [j]为text1的前i个字符,和text2的前j个字符为输入的LCS值。
- 动态方程为:
dp [i] [j] = dp [i - 1] [j - 1] + 1
dp [i] [j] = max(dp [i - 1] [j], dp [i] [j - 1]) - 具体为上面的转移情况还是下面的转移情况其实也很清楚:
- 如果这俩子序列中当前遍历的字符相同,很显然此时将当前字符从两个字符串中都去掉得到的LCS只 比当前多的这个字符时的LCS小1,也就是第一个状态转移方程。
- 如果不同,那也很简单,不同则需要前移两个字符串之一的指针,要么第一个字符串去掉最后一个, 要么第二个字符串去掉最后一个字符,此时对比他们两者情况下的LCS值,当前情况下的LCS比这两者中大那个LCS大1,如此即可。
- 按照以上思路代码实现即可
代码实现
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相关推荐
- 20200714:动态规划复习day05
动态规划复习day05 今天继续说股票问题三 题目: 买卖股票的最佳时机Ⅲ 解题思路 同理,我们还是按照老样子走. 先判断状态和选择 状态:今天第i天,我手里是否有股票,以及我卖出过几次股票. 选择: ...
- 20200713:动态规划复习day04
动态规划复习day04 继续说股票问题 题目: 买卖股票的最佳时机Ⅱ 解题思路 首先说明这题在力扣标记为简单的原因,看下面的贪心解法: class Solution {public int maxPr ...
- 20200710:动态规划复习day03
动态规划复习day03 今天来看股票问题1 题目一:买卖股票的最佳时机 解题思路 首先我们想到的不是动态规划的解法,是一个常规思路:找到后面与当前值的差值最大的那个值,即为我们需要找的卖出的day.因 ...
- 20200715:动态规划复习day06
统计全1子矩阵 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 题意很好理解,但是本题的动态规划不是常规思路的,你需要很好的理解题意并仔细分析状态与转移关系,才能定义正确的dp数组以及其dp ...
- 动态规划复习-HDU1081
注意多个测试用例,和poj不一样 注意输出用例结果之间要换行 代码如下: #include int rect[101][101]; int a[101], dp[101]; int n, mx; in ...
- 20200707:动态规划专题之不同路径
动态规划复习day01 动态规划的题目一直是本人的弱项,这周尝试连续7天的动态规划专题,争取做到有的放矢. 不同路径Ⅰ和Ⅱ解析 题目一:不同路径 解题思路 依据动态规划解题的套路思路 确定状态和选择, ...
- NOIP复习篇———贪心
NOIP复习篇---贪心 --------------------------------------------------------------------------------------- ...
- 算法设计与分析考前复习
算法设计与分析考前复习 qiwang的NOJ系统在考前一天崩了,强烈建议开发新OJ 另外,由于以下这些题是我上完数电实验用了下午和晚上时间写的,可能会出一些错. 分治法复习 二分查找 描述 给定一个单 ...
- 中级软件设计师知识总结
文章目录 复习进度 分型 一.面向对象 1 面向对象的概念 面向对象设计原则 2 UML 静态图/结构图包括: 动态图/行为图包括: 3 4 设计模式 设计模式概念 设计模式的分类 创建型模式 结构型 ...
最新文章
- Nginx负载均衡与配置Nginx的ssl
- 代码实现:键盘录入任意一个年份,判断该年是闰年还是平年
- 博士扩招!反正我是你们得不到的学生...
- linux下使用lftp的小结
- hive实现not in
- 关于android开发时,发生Error infalting classa com.baidu.mapapi.map.MapView的解决办法
- 控制台无法连接_指挥中心控制台整体解决方案,告别“信息孤岛”
- 基于JAVA+SpringMVC+Mybatis+MYSQL的企业通用门户网站官网
- 2021年黑龙江高考成绩查询,黑龙江省招生考试信息港:2021年黑龙江高考成绩查询入口、查分系统...
- 麦克纳姆轮全向移动机器人斜向直线运动分析
- 大数据应用需要注意什么问题
- Kubernetes 小白学习笔记(31)--kubernetes云原生应用开发-istio架构和安装
- STL---字符串使用方法
- 学习廖雪峰 Git 总结
- 蓝桥杯c语言大一的知识够了吗,参加蓝桥杯后的感受以及个人总结
- 安装DL380gen10
- 在vue中如何使用umy-ui
- Failed to read artifact descriptor for
- 前端项目使用阿里巴巴icon font的具体过程
- 《C程序设计》读后感
热门文章
- 罗永浩将举办「老人与海」发布会;微软疑似遭遇大范围全球宕机;Python 3.9 首个测试版发布 | 极客头条...
- 300 秒带你吃透大数据!
- 如何停止在技术债上浪费时间?
- 华为鸿蒙是物联网操作系统;字节跳动的飞聊被 App Store 下架;FFmpeg 作者编写 JS 引擎 | 极客头条...
- 带你吃透分布式的精髓!
- 为何优秀的程序员不断离开?| 畅言
- 这位曾指责乔布斯的怪老头,推出的AppleScript比Windows还要快!
- 泄漏 iOS 关键源码的人,居然是苹果的一个实习生
- 果蔬连连看java源代码_《基于Qt的连连看游戏的设计》-毕业论文.doc
- python审计运用_用Python来分析审计行业的这10年