Dynamic programming - 最长单调递增子串问题

【C】最长递增子串(LIS)求解 LIS(Longest Increasing Subsequence)最长递增子串问题是一道非常基础的DP问题,这里我们主要是为了给各位解释解决DP问题的最重要的方法之一——记忆化搜索,这里仅讲解复杂度为O(N2)的方法解决此问题,并且这里我们只需要求出最长子串长度,对具体是哪条子串也不做讨论,本文最后会附上O(NlogN)的解决问题的代码,但不做过多的解释说明。 我们先把定义弄清楚 什么是子串?... 阅读详情
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LPS
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] pre = { 9, 2, 3, 4, 5, 6 };
            int[,] rec = new int[pre.Length, pre.Length];
            Lps lps = new Lps(rec, pre.Length, pre);
            lps.Lps_initial();
            lps.Lps_length();
            rec = lps.Record;
            int [] res = res = lps.generate ();
            for (int i = 0; i < pre.Length; i++)
            {
                for (int j = 0; j < pre.Length; j++)
                {
                    Console.Write("{0} ", rec[i, j]);
                }
                Console.Write("\n");
            }
            for (int i = res[0]; i <= res[1];i++ )
                Console.Write("{0} ",pre[i]);
            Console.ReadKey();
        }
    }
    class Lps
    {
        public Lps(int [,] record,int x,int [] origin)
        {
            Record = record;
            Length = x;
            OriginSeq = origin;
        }
        public int[,] Record
        {
            get;
            set;
        }
        public int Length
        { set; get; }
        public int[] OriginSeq
        { get; set; }
        public void Lps_initial()
        {
            for (int i = 0; i < Length; i++)
            {
                for (int j = 0; j < Length; j++)
                {
                    if (i == j)
                        Record[i, j] = 1;
                    else
                        Record[i, j] = 0;
                }
            }
        }
        public void Lps_length()
        {
            for (int l = 2; l <= Length; l++)
            {
                for (int i = 0; i < Length - l + 1; i++)
                {
                    int j = i + l - 1;
                    if (Record[i, j - 1] == 0)
                        Record[i, j] = 0;
                    else if (OriginSeq[j - 1] < OriginSeq[j])
                        Record[i, j] = Record[i, j - 1] + 1;
                    else
                        Record[i, j] = 0;
                }
            }
        }
        public int[] generate()
        {
            int temp=0;
            int [] rec = {0,0};
            for (int i = 0; i < Length; i++)
            {
                for (int j = 0; j < Length; j++)
                {
                    if (Record[i, j] > temp)
                    {
                        temp = Record[i, j];
                        rec[0] = i;
                        rec[1] = j;
                    }
                }
            }
            return rec;
        }
    }
}

最长单调递增子序列 思路 用数组 a[n],来记录一个字符串,然后用dp[i]来记录以每一个a[i]为结尾的最长递增子序列的长度,dp数组的每一个元素初始值都为1 如果满足a[j]<a[i]则以a[i]为结尾的子序列长度是以a[j]为结尾的长度加一 状态转移方程为 dp[i]=max(dp[i],dp[j]+1) 代码 #include <iostream> #include <algori... 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作01

编号类型领域运算操作运算类型算法算法的详细设计及数学分析参数列表及参数的数值设计应用场景 (100+条)集合运算​1集合运算关系代数并集 (Union)集合运算归并排序去重合并两个集合,去除重复元素。时间复杂度 O(n+m),n,m为两集合大小。输入:集合A, B。输出:A∪B。数据集成、多表结果合并、去重后的全量数据提取。2集合运算关系代数交集 (Intersection)集合运算哈希交集找出同时属于两个集合的元素。平均时间复杂度 O(min(n,m)),最坏 O(n*m)。输入:集合A, B。输出:A∩

weixin_49199313的博客 1389

最长单调递增子序列的三种解法

从报名蓝桥杯开始我就觉得我走入了一条及其坑的路。 从大一到大三我写过的代码,思考过的算法真是少之又少,一个动态规划我依旧没有吃透,真的是觉得好有挫败感。不过还好,一点点来。 既然知道自己要去做这件事情,就认真去做吧。就算开始的比较晚但是能学到东西就很好。 这是转载自爱天涯技术论坛。http://qiemengdao.iteye.com/blog/1660229 解释

艾米栗的代码天地 2042

【Codex安装使用手册】

Codex安装部署使用教程

qq_43392230的博客 4966

最长递增子串(LIS)

给定一个序列,要求求出该序列的最长单调子序列, 即 longest increasing subsequence,这是一个经典的动态规划求解问题。 设给定序列为 a[],大小为 n,如何求其最长单调子序列呢?考虑将最长单调子序列的长度作为所求的最优值,最长单调子序列必定以序列a[]中的某一个元素结尾。 设序列count[i]为以a[i]结尾的最长单调子序列的长度,那么a[]的LIS的长度...

weixin_33767813的博客 186

香橙派5Max + Realsense D435i + Fast-Drone-250:手把手教你搭建一个完整的无人机视觉开发环境

本文详细介绍了如何利用香橙派5Max、Realsense D435i深度相机和Fast-Drone-250项目搭建完整的无人机视觉开发环境。从硬件连接到ROS配置,再到项目部署与性能优化,提供全栈式实战指南,助力开发者快速实现SLAM算法验证和自主导航功能开发。

weixin_30879169的博客 463

Python实战:5分钟搞定固定翼无人机三自由度仿真(附完整代码)

本文提供了一个基于Python的固定翼无人机三自由度仿真快速实现方案。通过面向对象设计,封装了核心运动学模型,并对比了欧拉法与龙格-库塔法两种积分方法。文章附有完整实例代码,帮助算法工程师和研究人员在5分钟内搭建轻量级仿真环境,用于快速验证控制律、路径规划等核心算法逻辑。

docker7nomad的博客 748

最长递增子序列(Longest Increase Subsequence)

问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4. 解决方案: 1,新建一个二维数组ret[ ][ ];以数组A[ ]={2 , 1 , 5 , 9}为例: ~ 2 1 5 9 0 ...

weixin_33872660的博客 112

基于Arduino的智能垃圾桶

通过本次简单的Arduino智能垃圾桶小实验可以快速了解Arduino的基本用法 1、材料准备 Arduino UNO HC-SR04超声波模块 SG90舵机 杜邦线 电源 电脑 2、代码分析 电机的控制 #include<Servo.h> #define duoji D5 Servo myduoji; void setup() { myduoji.attach(duoji); //舵机连接 Serial.begin(115200); } void loop() { myduoji.w

weixin_41679960的博客 1万+

贪心算法学习——最长单调递增子序列

最长递增子序列,贪心解法。

qq_41934502的博客 802

修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

【代码】修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

路~可以走过 2772

基于STM32L4XX 、HAL库的TMC2226-SA-T步进电机驱动器驱动程序应用设计

集成的功率MOSFET可处理高达2A RMS的电机电流,并具备保护与诊断功能,确保运行稳健可靠。作为业界最先进的STEP/DIR步进电机驱动系列,该芯片通过升级设计实现无噪音、高精度运行,为用户提供高性价比且极具竞争力的解决方案。// 用于PDN_UART单线通信。// HAL_UART_Transmit - 注意PDN_UART是单线,收发共线。.huart = &huart1, // PDN_UART连接的USART。均方根步进/方向控制接口,提供8、16、32或64微步针设置,

PP_Cottage的博客 625

最长单调递增子序列, 子串和

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklm

昊昊的专栏 699

Python 爬虫实战:龙虎榜机构买卖数据爬取与代码详解(附数据分析)

龙虎榜是证券市场中重要的市场信息之一,记录了当日大宗交易及机构买卖情况,包括机构名称、买卖方向、成交金额、成交股数、买入卖出价格等信息。通过分析龙虎榜数据,投资者可以更好地了解市场动向和机构投资者的行为,从而做出更准确的决策。本文将详细介绍如何使用 Python 编写爬虫程序,高效地抓取龙虎榜机构买卖数据,并进行数据分析。我们将从环境搭建、数据抓取、数据存储到数据分析等关键步骤逐一展开,帮助读者掌握完整的爬虫实战流程。

u014481728的博客 702

最大连续子序列和,乘积,最长递增子串,最长公共子串,子序列等问题(动态规划等)

本文地址:http://blog.youkuaiyun.com/qq_26437925/article/details/52679690对标题问题的整理(题目来源牛客网,leetcode, PAT),可以学习这一类型的编程思路,联想编程,不至于太混乱。最大连续子序列和问题53 . Maximum Subarray(leetcode)题目地址 https://leetcode.com/problems/maxi

master-dragon的专栏 2131

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

动态规划之最长递增子串

题目:给定一个数组,找出其中最长的递增子串的长度。 解析:这个很明显就是使用动态规划来进行求解,依次求解每个位置的最长递增子串的长度,然后依次进行比较。 代码: class Solution { public int lengthOfLIS(int[] nums) { if(nums.length==0) return 0; ...

qq_40133908的博客 769

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

求最长递增子序列问题

最长递增子序列问题是一个很基本、较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能够锻炼设计较复杂算法的思维,我对这个问题进行了较深入的分析思考,得出了几种复杂度不同算法,并给出了分析和证明。一,    最长递增子序列问题的描述设L=a1,a2,…,an>是n个不同的实数的

jokerfox的专栏 1784

最长递增子串(LIS)算法_严格单调递增_单调递增_连续_不连续

最长递增子串问题总结 分类 最长递增子串(LIS),可以按照以下两个属性——是否严格单调递增,是否连续,分成四类: 1.(严格单调递增,连续) 2.(非严格单调递增,连续) 3.(严格单调递增,不连续) 4.(非严格单调递增,不连续) 算法: 情况1,2比较简单,一重循环,可以在O(n)的时间内解决 情况3: 对于每一个num[i],搜素停在末尾或者>=num[i]

feima_1的专栏 1266

最长单调递增子序列O(nlogn)

#include "iostream" #include "fstream" using namespace std;/* b[k]表示长度为i的子序列c[i]中,长度为k的最长单调递增子序列的最小结尾元素值 当c[i]>=b[k], k = k + 1; b[k] = a[i] 否则,将c[i]放置到b[]中适当位置 */int b[100]; int c[100];//二分搜索法在b[1,k]中

新博客:https://aping-dev.com/ 1156

最长递增子串问题

eg: 一个字符串"1 4 2 3 5",求最长递增子串。 结果为"1 2 3 5"最大递增子串的长度为4 可以采用动态规划的方法来解决这个问题: 我们可以把原问题进行分解,分别求出第1个位置上的递增子串的长度,第2个位置上的xx长度.....第n个位置上的xx长度。。。 不妨设置一个数组longest[len]来存储1~n个位置上递增子串的长度,然后在数组中找出最大的那个数,就是最递增

记忆碎片 3581

NYOJ-单调递增最长子序列(两种算法)

单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入第一行一个整数0 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklm

信仰.的博客 649

java最长单调递增子字符串

public class LongestSubString { public static void main(String[] args){ String  s = "abcabcdeabcd"; System.out.println(getLengthchar(s)); } public static String getLengthchar(String s){ String s

miqiong9993的博客 1334

最长递增子序列

问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4. 解法1:最长公共子序列法 这个问题可以转换为最长公共子序列问题。如例子中的数组A{5,6, 7, 1, 2, 8},则我们排序该数组得到数组A‘{1, 2, 5, 6, 7,...

切梦 5419

求解最长单调递增子串

求解最长递增子串可分为两种情况,即子串连续或非连续。 例如,对于整数串{1,3,5,1,-1,4,5,3,1,8,3,4,6,2,4,6,7,8,6,4} 其连续递增子串为{2,4,6,7,8},非连续递增子串为{{-1},{1},{2,4,6,7,8}} 连续递增子串的求解思路: 采用动态规划思想,令 lengthOfSubList[k]表示子串{list[0]....

weixin_34087301的博客 315

NYOJ 单调递增最长子序列

单调递增最长子序列 时间限制:3000ms | 内存限制:65535KB 难度:4 描述求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4 输入第一行一个整数0<n<20,表示有n个字符串要处理随后的n行,每行有一个字符串,该字符串的长度不会超过10000输出输出字符串的最长递增子序列的长度样例输入 3 aaa...

weixin_30858241的博客 401
上一篇: Dynamic programming - LSC problem
下一篇: Dynamic programming - 最长回文子序列问题
Numlogn
博客等级 码龄10年 1粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值