2021.07.18

本文介绍了动态规划在解决最长递增子序列和最长回文子串问题上的应用。首先详细讲解了如何利用动态规划设计最长递增子序列的算法,接着讨论了最长回文子串的动态规划思路,包括状态转移方程和基础情况。最后,概述了动态规划在处理子序列问题时的一维和二维数组模板。
摘要由CSDN通过智能技术生成

动态规划设计之最长递增子序列

题目
在这里插入图片描述
注意
注意「子序列」和「子串」这两个名词的区别,子串一定是连续的,而子序列不一定是连续的。下面先来设计动态规划算法解决这个问题。

思路

  1. 我们先假设这个结论在 k<n 时成立,然后根据这个假设,想办法推导证明出 k=n 的时候此结论也成立。可以假设 dp[0…i-1] 都已经被算出来了,然后问自己:怎么通过这些结果算出 dp[i]?
  2. 定义:dp[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度。
    如:
    在这里插入图片描述
    在这里插入图片描述
  3. 最终结果(子序列的最大长度)应该是 dp 数组中的最大值。
  4. 假设我们已经知道了 dp[0…4] 的所有结果,我们如何通过这些已知结果推出 dp[5] 呢?
  5. 既然是递增子序列,我们只要找到前面那些结尾比 3 小的子序列,然后把 3 接到最后,就可以形成一个新的递增子序列,而且这个新的子序列长度加一。
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);
    }
}

完整代码

public int lengthOfLIS(int[] nums) {
   
    int[] dp = new int[nums.length];
    // base case:dp 数组全都初始化为 1
    Arrays.fill(dp, 1);
    for (int i = 0; i <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值