问题描述

​ 以一个乱序的数组,求它的最长双音序列长度。双音序列指该序列先递增,再递减。

​ 如:

  • 对于序列 {1, 11, 2, 10, 4, 5, 2, 1},它的最长双音序列长度为 6,
  • 对于序列 {12, 11, 40, 5, 3, 1},它的最长双音序列长度为 5,

解决思路

​ 这是最长递增子序列问题(LIS)的扩展,只要找到得到对应的递增子序列和最长递减子序列的零时数组进行组合即可。

实现

public class Solution {
public static int lbs(int[] array) {
int len = array.length; if (1 == len) return 1; // 边界情况 int[] lis = new int[len]; // 递增序列的每个索引位置的最长长度数组
int[] lds = new int[len]; // 递减序列的每个索引位置的最长长度数组 // 初始化这两个数组,对于每个元素来讲,它们的最短长度为 1
for (int i = 0; i < len; ++i) {
lis[i] = 1;
lds[i] = 1;
} // 得到该递增数组的具体细节可以查看 LIS 问题的解法
for (int i = 1; i < len; ++i) {
for (int j = 0; j < i; ++j) {
if (array[i] > array[j])
lis[i] = Math.max(lis[i], lis[j] + 1);
}
} // 与寻找最长递增数组相反,从后往前找递增的序列即可得到递减序列的记录数组
for (int i = len - 2; i >= 0; --i) {
for (int j = len - 1; j > i; --j) {
if (array[i] > array[j])
lds[i] = Math.max(lds[i], lds[j] + 1);
}
} int ans = 1;
for (int i = 0; i < len; ++i) {
// 将两个记录数组的长度进行组合即可得到最大的双音序列长度
// 这里减一是因为这两个记录数组在相同的位置索引具有重复元素
ans = Math.max(ans, lis[i] + lds[i] - 1);
} return ans;
}
}

动态规划问题(四)最长双音序列长度(LBS)的更多相关文章

  1. LeetCode 128. 最长连续序列(Longest Consecutive Sequence)

    题目描述 给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1 ...

  2. 最长DNA重复序列长度,并输出该序列。 JAVA

    1:  最长DNA重复序列长度,并输出该序列. 例如  ATCGTAGATCG,它的最大长度为4,序列为 ATCG. package com.li.huawei; import java.util.S ...

  3. 【动态规划】【最长上升子序列】【贪心】bzoj1046 [HAOI2007]上升序列

    nlogn求出最长上升子序列长度. 对每次询问,贪心地回答.设输入为x.当前数a[i]可能成为答案序列中的第k个,则若 f[i]>=x-k && a[i]>ans[k-1] ...

  4. JDOJ 1929: 求最长不下降序列长度

    JDOJ 1929: 求最长不下降序列长度 JDOJ传送门 Description 设有一个正整数的序列:b1,b2,-,bn,对于下标i1<i2<-<im,若有bi1≤bi2≤-≤ ...

  5. Java实现 LeetCode 522 最长特殊序列 II(查找最长的非子序列的长度)

    522. 最长特殊序列 II 给定字符串列表,你需要从它们中找出最长的特殊序列.最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列). 子序列可以通过删去字符串中的某些 ...

  6. [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

  7. [LeetCode] Number of Longest Increasing Subsequence 最长递增序列的个数

    Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...

  8. 题解-洛谷P1020P导弹拦截(求单调序列长度的优化)

    https://www.luogu.org/problemnew/show/P1020 (原题链接) 第一问就是求最长不上升子序列的长度,自然就想到了c++一本通里动态规划里O(n^2)的算法,但题目 ...

  9. 最长上升序列 LCS LIS

    子序列问题 (一)一个序列中的最长上升子序列(LISLIS) n2做法 直接dp即可: ;i<=n;i++) { dp[i]=;//初始化 ;j<i;j++)//枚举i之前的每一个j ) ...

  10. C语言 · 最长公共子序列 · 最长字符序列

    算法提高篇有两个此类题目: 算法提高 最长字符序列   时间限制:1.0s   内存限制:256.0MB      最长字符序列 问题描述 设x(i), y(i), z(i)表示单个字符,则X={x( ...

随机推荐

  1. Java 21新特性:Sequenced Collections(有序集合)

    在JDK 21中,Sequenced Collections的引入带来了新的接口和方法来简化集合处理.此增强功能旨在解决访问Java中各种集合类型的第一个和最后一个元素需要非统一且麻烦处理场景. 下面 ...

  2. ddddocr1.4.8失效的解决方法

    1. 问题描述 from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.max ...

  3. visio 2010 kit tools

    Getting Office License Configuration Information.---------------------------------------Backing Up L ...

  4. 在 Rust 中实现 Repository 仓储模式

    前言 单位上有个 Rust 项目,orm 选型很长时间都没定下来,故先设计了抽象的仓储层方便写业务逻辑. 设计抽象接口 抽象只读接口,仅读取使用,目前需求仅用查询 id.查询全部和按名称搜索,当然理应 ...

  5. 如何在虚拟机上安装linux操纵系统

    1.下载linux操作系统的镜像文件(iso文件),官网链接(CentOS Mirrors List) (3)下载大小为4G 或者4.几G的iso镜像文件 2.下载我发的VMware Workstat ...

  6. RL 基础 | Value Iteration 的收敛性证明

    (其实是专业课作业 感觉算法岗面试可能会问,来存一下档) 目录 问题:证明 Value Iteration 收敛性 0 Definitions - 定义 1 Bellman operator is a ...

  7. CF1854E Games Bundles 题解

    乱搞题 设个 \(dp[i]\) 表示和为 \(i\) 的子序列个数,那么转移是容易的, \(dp[j]+=dp[j-i]\) ,然后就判下 \(dp[60]+dp[60-i]\) 是否大于 \(m\ ...

  8. P8816 [CSP-J 2022] 上升点列

    Problem 考察算法:\(DP\). 题目简述 给你 \(n\) 个点,每个点有一个坐标 \((x_i,y_i)\),还可以添加 \(k\) 个点. 添加之后,求:最长的上升点列的长度. 上升点列 ...

  9. Terraform 系列-使用Dynamic Blocks对Blocks进行迭代

    系列文章 Terraform 系列文章 Grafana 系列文章 概述 Terraform 系列文章 介绍了使用 Grafana Terraform Provider, 基于 Terraform 的 ...

  10. DiscuzQ官方最新v3.0.220211源码编译搭建教程和官方部署教程,适合二开(已本地编译通过,无任何错误)

    经过长达半个月的研究! 完成这篇DiscuzQ官方最新版本v3.0.220211的源码编译和官方部署教程.适合喜欢二次开发的小伙伴们,已经通过本地编译测试,保证没有任何错误. 具体教程在我搭建的dzq ...