求解最长单调递增子串
求解最长递增子串可分为两种情况,即子串连续或非连续。
例如,对于整数串{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]...list[k]}中最长的连续递增子串长度
lengthOfSubListIncludeK[k]表示子串{list[0]...list[k]}中以list[k]结尾的最长连续递增子串长度
indexOfLastElement[k]表示子串{list[0]...list[k]}中最长的连续递增子串的最后一个元素的位置
则
lengthOfSubListIncludeK[k] =
lengthOfSubListIncludeK[k-1]+1,list[k]>=list[k-1]
1, list[k]<list[k-1]
lengthOfSubList[k] = max(lengthOfSubListIncludeK[k],lengthOfSubList[k-1])
indexOfLastElement[k] =
k, lengthOfSubListIncludeK[k]>lengthOfSubList[k-1]
indexOfLastElement[k-1],lengthOfSubListIncludeK[k]<=lengthOfSubList[k-1]
代码:
- #include <stdlib.h>
- #include <stdio.h>
- void MaxIncrementSubList(int list[],int length)
- {
- //lengthOfSubList[k]表示子串{list[0]...list[k]}中最长的连续递增子串长度
- //lengthOfSubListIncludeK[k]表示子串{list[0]...list[k]}中以list[k]结尾的最长连续递增子串长度
- int* lengthOfSubList = (int*)malloc(sizeof(int)*length);
- int* lengthOfSubListIncludeK = (int*)malloc(sizeof(int)*length);
- int* indexOfLastElement = (int*)malloc(sizeof(int)*length);
- int i;
- //初始化
- for (i=0;i<length;i++)
- {
- lengthOfSubList[i] = 1;
- lengthOfSubListIncludeK[i] = 1;
- indexOfLastElement[i] = i;
- }
- //按照动态规划思想,计算lengthOfSubList[k]和lengthOfSubListIncludeK[k]
- for (i=1;i<length;i++)
- {
- if (list[i]>=list[i-1]) lengthOfSubListIncludeK[i] = lengthOfSubListIncludeK[i-1]+1;
- else lengthOfSubListIncludeK[i] = 1;
- if (lengthOfSubListIncludeK[i]>lengthOfSubList[i-1])
- {
- lengthOfSubList[i] = lengthOfSubListIncludeK[i];
- indexOfLastElement[i] = i;
- }
- else
- {
- lengthOfSubList[i] = lengthOfSubList[i-1];
- indexOfLastElement[i] = indexOfLastElement[i-1];
- }
- }
- //逆序输出最长连续递增子串
- printf("longest sub list is:\n");
- int idx = indexOfLastElement[length-1];
- while (list[idx]>=list[idx-1])
- {
- printf("[%d]=%d ",idx,list[idx]);
- idx--;
- }
- printf("[%d]=%d ",idx,list[idx]);
- }
- int main()
- {
- int list[20] = {1,3,5,1,-1,4,5,3,1,8,3,4,6,2,4,6,7,8,6,4};
- MaxIncrementSubList(list,20);
- int a;
- scanf("%d",&a);
- return 0;
- }
非连续递增子串的求解思路:
采用动态规划思想,令
lengthOfSubList[k]表示子串{list[0]...list[k]}中最长的非连续递增子串长度
lengthOfSubListIncludeK[k]表示子串{list[0]...list[k]}中以list[k]结尾的最长非连续递增子串长度
indexOfLastElement[k]表示子串{list[0]...list[k]}中最长的非连续递增子串的最后一个元素的位置
则
lengthOfSubListIncludeK[k] = max(lengthOfSubListIncludeK[i]+1, list[k]>=list[i], i=0..k-1)
lengthOfSubList[k] = max(lengthOfSubListIncludeK[k],lengthOfSubList[k-1])
indexOfLastElement[k] =
k, lengthOfSubListIncludeK[k]>lengthOfSubList[k-1]
indexOfLastElement[k-1],lengthOfSubListIncludeK[k]<=lengthOfSubList[k-1]
代码:
- #include <stdlib.h>
- #include <stdio.h>
- void MaxIncrementSubList(int list[],int length)
- {
- //lengthOfSubList[k]表示子串{list[0]...list[k]}中最长的非连续递增子串长度
- //lengthOfSubListIncludeK[k]表示子串{list[0]...list[k]}中以list[k]结尾的最长非连续递增子串长度
- int* lengthOfSubList = (int*)malloc(sizeof(int)*length);
- int* lengthOfSubListIncludeK = (int*)malloc(sizeof(int)*length);
- int* indexOfLastElement = (int*)malloc(sizeof(int)*length);
- int i,j,max;
- //初始化
- for (i=0;i<length;i++)
- {
- lengthOfSubList[i] = 1;
- lengthOfSubListIncludeK[i] = 1;
- indexOfLastElement[i] = i;
- }
- //按照动态规划思想,计算lengthOfSubList[k]和lengthOfSubListIncludeK[k]
- for (i=1;i<length;i++)
- {
- max = lengthOfSubListIncludeK[i];
- for (j=0;j<i;j++)
- {
- if (list[i]>list[j])
- {
- lengthOfSubListIncludeK[i] = lengthOfSubListIncludeK[j]+1;
- if (max<lengthOfSubListIncludeK[i]) max = lengthOfSubListIncludeK[i];
- }
- }
- lengthOfSubListIncludeK[i] = max;
- if (lengthOfSubListIncludeK[i]>lengthOfSubList[i-1])
- {
- lengthOfSubList[i] = lengthOfSubListIncludeK[i];
- indexOfLastElement[i] = i;
- }
- else
- {
- lengthOfSubList[i] = lengthOfSubList[i-1];
- indexOfLastElement[i] = indexOfLastElement[i-1];
- }
- }
- //逆序输出最长非连续递增子串
- printf("longest sub list is:\n");
- int idx = indexOfLastElement[length-1];
- int tmp = list[idx];
- for (i=idx;i>=0;i--)
- {
- if (list[i]<=tmp)
- {
- printf("[%d]=%d ",i,list[i]);
- tmp = list[i];
- }
- }
- }
- int main()
- {
- int list[20] = {1,3,5,1,-1,4,5,3,1,8,3,4,6,2,4,6,7,8,6,4};
- MaxIncrementSubList(list,20);
- int a;
- scanf("%d",&a);
- return 0;
- }
转载于:https://blog.51cto.com/zephiruswt/888847
求解最长单调递增子串相关推荐
- 最长单调递增子序列 [转]
[转] http://skynewborn.blog.sohu.com/66594610.html 单调子序列包含有单调递增子序列和递减子序列,不失一般性,这里只讨论单调递增子序列.首先,从定义上明确 ...
- 最长单调递增子序列O(NlogN)算法
O(NlgN)算法 假设存在一个序列d[1..9] ={ 2,1 ,5 ,3 ,6,4, 8 ,9, 7},可以看出来它的LIS长度为5. 下面一步一步试着找出它. 我们定义一个序列B,然后 ...
- 最长单调递增子序列 python_最长单调递增子序列
前面三篇博客分别讲了贪心,递归,分治,今天就说个简单的动态规划(DP)的题目吧.在我心中DP算是比较难的算法,尤其像状态DP,树形DP,因为实力问题就说一个简单的线性DP--最长单调递增子序列. 题目 ...
- java最长单调递增子序列_最长单调递增子序列问题
最长单调递增子序列问题 题目:设计一个 O( n ^ 2 )复杂度的算法,找出由 n 个数组成的序列的最长单调递增子序列. import java.util.Scanner; public class ...
- 输出最长单调递增子序列java_动态规划实现最长单调递增子序列
1. 实验环境 操作系统:Mac 64 运行内存:16GB 编程语言:Java 编译环境:Eclipse 2. 题目要求 设计一个Ο(nlgn)时间的算法,求一个 n 个数的序列的最长单调递增子序列. ...
- 动态规划作业 最长单调递增子序列
动态规划作业 1.最长单调递增子序列 设计一个 O(n2)时间的算法,找出由 n 个数组成的序列 a 的最长单调递增子序列. 提示: 用数组 b[0:n]纪录以 a[i] (0<= i< ...
- 最长单调递增子序列(时间复杂度O(nlogn))
写在前面:仅为个人代码/总结,未必标准,仅供参考!如有错误,还望指出交流,共同进步! 最长单调递增子序列 [题目描述] 找出由n个数组成的序列中的最长单调递增子序列及其长度. [O(n*n)算法解题思 ...
- 最长单调递增子序列 动态规划 (java)
题目描述: 设计一个O(N^2)算法,找出n个数据组成的序列的最长单调递增子序列. 输入示例: 8 1 2 3 -9 3 9 0 11 输出示例: 5 1 2 3 9 11 设计思路: 有一个数组 a ...
- 最长单调递增子序列--动态规划
最长单调递增子序列定义: 问题描述: 设计一个O(n2)时间的算法, 找出由n个数组成的序列的最长单调递增子序列. 输入 第1个整数n(0<n<100),表示后面有n个数据,全部为整数. ...
最新文章
- ubuntu 系统设置bugzilla制
- amd64 与 ia64的区别
- MySQL中查询时对字母大小写的区分
- [Linux] Linux smaps接口文件结构
- 微软全部正版软件下载地址和序列号索取
- paddlepaddle测试安装_PaddlePaddle升级解读 | 十余行代码完成迁移学习,PaddleHub实战篇...
- 【windows】安装pytorch1.7.1-cpu版本的geometric过程记录
- 【windows】windows系统下,在任务管理器的进程选项卡中查看PID/任务管理器怎么查看PID...
- CVPR 2019 | 近日新出论文汇总(含视频目标分割、GAN、度量学习、高效语义分割等主题)...
- 现代操作系统 第一章 引论 习题
- (亲测可用)基于matlab的用自写函数来实现图像的灰度处理sobel canny算子边缘检测
- 中国农业大学研究生计算机学院宿舍,中国农业大学宿舍条件怎么样
- JPEG文件二进制格式分析
- java.lang.RuntimeException
- 完全端到端语音合成JETS: Jointly Training FastSpeech2 and HiFi-GAN for End to End Text toSpeech 简单解读
- 弹性伸缩Auto Scaling
- 本大三狗处博——为工作消得人憔悴
- Undefined/Null/Boolean数据类型
- C++ Google代码风格
- 邓俊辉数据结构学习笔记2
热门文章
- ROS知识【7】:ubuntu环境如何卸载ROS
- 银行java多线程例子_Java 多线程 之 银行ATM实例
- php微信分享时好时坏,手机端微信分享前几天都是正常的今天发现分享出去就不正常了设置,迅睿CMS,CodeIgniter技术文档,PHP开发文档,迅睿CMS框架官方教程...
- ios 获取沙河文件夹_关于 iOS 沙盒的目录结构和获取
- 界面上下固定_基于ANSYS的胶粘结构界面开裂有限元计算
- Opencv Kmeans聚类算法
- 【自动驾驶】9.分布式通信技术之发布订阅,干货满满
- 【Linux】18.设置静态ip的方法(Ubuntu系统、nas、Red-Hat系统)
- 说说 JAVA 代理模式
- Java内部类(Inner Class)小记