单调递增最长子序列(南阳理工ACM)
描述
求一个字符串的最长递增子序列的长度
如:dabdbf最长递增子序列就是abdf,长度为4
- 输入
-
第一行一个整数0<n<20,表示有n个字符串要处理
随后的n行,每行有一个字符串,该字符串的长度不会超过10000 - 输出
- 输出字符串的最长递增子序列的长度
- 样例输入
-
3 aaa ababc abklmncdefg
- 样例输出
-
1 3 7
有两种方式可以求解,
解法一:
首先对字符串S1进行从小到大排序,然后删除有序数组相同的字符得到S2。再求S1与S2的最长子串即可(求子串的方法见两个字符串的最长相同子序列)。
排序方法:
1 public static char[] sort(char[] P,ref int m) 2 { 3 4 for (int j = 0; j < P.Length - 1; j++) 5 { 6 for (int i = 0; i < P.Length - 1 - j; i++) 7 { 8 if (P[i] > P[i + 1]) 9 { 10 char point1 = P[i]; 11 P[i] = P[i + 1]; 12 P[i + 1] = point1; 13 } 14 } 15 } 16 char x = P[1]; 17 int k = 2; 18 for (int i = 2; i < P.Length; i++) 19 { 20 if (P[i] != x) 21 { 22 P[k] = P[i]; 23 x = P[i]; 24 k++; 25 } 26 } 27 m = k; 28 return P; 29 }
View Code
解法二:
利用动态规划的思想,求S1[0...i]的最长递增子串,只需要比较S1[0...i-1]中S1[k]与S1[i]的大小。
f(i)=max(f(i-1),f(i-2),...,f(0))+1;用一个int dp[i]数组保存当前的f(i)值,即到第i个元素的最长递增子序列。
递推方程的意思是,在求以ai为末元素的最长递增子序列时,找到所有序号在i前面且小于ai的元素aj,即j<i且aj<ai。如果这样的元素存在,那么对所有aj,都有一个以aj为末元素的最长递增子序列的长度f(j),把其中最大的f(j)选出来,那么f(i)就等于最大的f(j)加上1,即以ai为末元素的最长递增子序列,等于以使f(j)最大的那个aj为末元素的递增子序列最末再加上ai;如果这样的元素不存在,那么ai自身构成一个长度为1的以ai为末元素的递增子序列。
1 public static int LongestAddSubsequence(string A) 2 { 3 int longest = 1; 4 int[] dp = new int[A.Length]; 5 for (int i = 0; i < A.Length; i++) 6 dp[i] = 1;//初始话均为1 7 for (int i = 1; i < A.Length; i++) 8 for (int j = i - 1; j >= 0; j--) 9 if (A[i] > A[j] && dp[i] < dp[j] + 1)//遇到比当前值小,并且长度比当前长度大的就更新当前长度 10 dp[i] = dp[j] + 1; 11 for (int i = 0; i < A.Length; i++) 12 if (dp[i] > longest) 13 longest = dp[i]; 14 return longest; 15 }
View Code
转载于:https://www.cnblogs.com/xiaoyi115/p/3175549.html
单调递增最长子序列(南阳理工ACM)相关推荐
- 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹
一, 最长递增子序列问题的描述 设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,-,akm>,其中k1< ...
- 单调递增最长子序列 - 从最长公共子序列到单调递增最长子序列
最长公共子序列 的 算法思路 在这里 点击进入 将 代码稍微改动一下 就可以 , 最长公共子序列 是两个 字符串求 公共子序列 , 可以将其中的 一个 改为 从 a 到 z 这样输入另 ...
- 动态规划之-----单调递增最长子序列(nyoj17)
单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行 ...
- 单调递增最长子序列 拦截导弹(nyoj 17 nyoj 79)
思路参考:点击打开链接 单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf ...
- 单调递增最长子序列(动态规划)
7-1 单调递增最长子序列 (20分) 设计一个 O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列. 输入格式: 输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字 ...
- nyoj-17 单调递增最长子序列(灵活应对)
单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行 ...
- 24-单调递增最长子序列(多种解法总结)
单调递增最长子序列 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=17 时间限制:3000 ms | 内存限制:65535 KB 难度:4 ...
- NYOJ-单调递增最长子序列(dp)
单调递增最长子序列 描述: 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入: 第一行一个整数0<n<20,表示有n个字符串要处理 随后的n行 ...
- 南阳理工ACM 题4《ASCII码排序》
4-ASCII码排序 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:76 submit:115 题目描述: 输入三个字符(可以重复)后,按各字符的A ...
最新文章
- 关于PHP.ini文件的设定
- cntos7 安装Anaconda3 和Jupyter notebook
- Win 系统 PyTorch 安装配置教程
- JSP由浅入深(3)—— 通过表达式增加动态内容
- c语言坐标输出图片,tc 如何在指定坐标处 输出bmp图片??
- json tostringfiy_JS学习笔记 : 类型转换之「抽象值操作」
- MySQL 删除用户权限
- 今日头条新出算法大赛!短视频内容理解与推荐竞赛
- Kafka生成消息时的3种分区策略
- servlet destroy 示例_Servlet中的Listener的应用
- 从零开始学前端:列表标签 --- 今天你学习了吗?(CSS:Day06)
- ArcGIS API for Silverlight 调用GP服务绘制等值面
- CISCO发现协议(CDP)理论与实验
- 地脚螺钉直径系列_干数控这么久,现在才分清楚螺栓、螺钉、螺柱的区别
- 黑科技VNET——最好用的Android抓包神器
- 工作流-Activiti7-基础讲解
- ie8 css hack 只适用ie8的css写法
- 疑难杂症篇(十六)--虚拟机出现“The system is running in low-graphics mode“问题的解决方案
- C++ pair的常见用法(详细)
- Python中int32转int64
热门文章
- 小学五年级计算机进度安排,五年级下册信息技术年度教学计划
- mysql8.0.19.0安装_一、MySQL8.0.19 安装教程
- 计算机多媒体理论知识,计算机多媒体技术07311.doc
- linux运维脚本编写,Linux运维常用shell脚本实例 (转)
- c语言习题与实验doc,[教材]C语言程序设计习题与上机实验(全部答案).doc
- 全字库说文解字字体_整理了10款免费商用中文字体,超好用
- android 6.0虚拟内存,Maxwell的统一虚拟内存只用在专业卡上,GTX 750 Ti或无缘
- 罗辑思维 - 当代的学习方法
- RRDTool 存储原理简介——基于时间序列的环型数据库
- 十大经典算法排序总结对比