Time Limit: 1 second
Memory Limit: 128 MB

【问题描述】

非常经典的问题,拿来给大家练手了。 序列 { 1,2,...,n } 的一个子序列是指序列 { i1, i2, ……, ik },其中 1<=i1 < i2 < …… < ik<=n, 序列 { a1, a2, ……, an } 的一个子序列是指序列 { ai1, ai2, ……, aik },其中 { i1, i2, ……, ik } 是 { 1, 2, ……, n } 的一个子序列.同时,称 k 为此子序列的长度. 如果 { ai1, ai2, ……, aik } 满足 ai1 ≤ ai2 ≤ …… ≤ aik,则称之为上升子序列.如果不等号都是严格成立的,则称之为严格上升子序列.同理,如果前面不等关系全部取相反方向,则称之为下降子序列和严格下降子序列. 长度最长的上升子序列称为最长上升子序列.本问题对于给定的整数序列,请求出其最长上升子序列的长度.

【输入格式】

第一行给出一个数字N,N < = 5000,表示给定数列的长度。第二行有N个整数, 表示数列中的元素

【输出格式】

输出K的极大值,即最长上升子序列的长度

【数据规模】

Sample Input1

5
9 3 6 2 7

Sample Output1

3

【样例说明】

最长上升子序列为3,6,7

【题解】

程序1,用f[i]表示以i作为最后一个元素的最长上升子序列长度,f[i] = max(f[i],f[j]+1),其中 a[i] >= a[j]; j ∈(1,i-1);

程序2,用f[i]表示长度为i的最长上升子序列的最后一个元素的最小值,在扫描输入的数组a时,如果a[i] > f[maxl],那么maxl++,f[maxl] = a[i],否则 从maxl-1 到 1扫描一下,

找到最大的j使得a[j] <= a[i] ,然后 f[j+1] = a[i];即更新长度为j+1的最长上升子序列的最后一个数的最小值。最后输出maxl就好。

程序2可以用二分查找来优化做到nlogn,但是二分查找写起来很麻烦、

【程序1】

#include <cstdio>int n,a[5002],f[5002],ans = 0;void input_data()
{scanf("%d",&n);for (int i = 1;i <= n;i++)scanf("%d",&a[i]);
}int ma_x( int a,int b)
{if (a > b)return a;elsereturn b;
}void get_ans()
{for (int i = 1;i <= n;i++) {f[i] = 1;//f[i] == 1表示 从这个数字开始新的一个序列 长度为1for (int j = 1;j <= i-1;j++) //或者从之前的序列中更新,让这个数字作为最后一个数{if (a[i] >= a[j]) //前提是这个数字要比前面的数字大 且长度加上1之后会比这个数字作为其他序列的最后一个数字来的更好(长度更长)f[i] = ma_x(f[i],f[j] + 1);}if (f[i] > ans) // 如果比最优解更优 则更新ans = f[i];}
}void output_ans()
{printf("%d\n",ans);
}int main()
{input_data();get_ans();output_ans();return 0;
}

【程序2】

#include <cstdio>int n,a[5002],f[5002],ans = 0,maxl = 0;void input_data()
{scanf("%d",&n);for (int i = 1;i <= n;i++)scanf("%d",&a[i]);for (int i = 1;i <= n;i++)f[i] = 0;f[0] = -200000000;//这个f[0]的边界 可以方便后面的求解
}void get_ans()
{for (int i = 1;i <= n;i++){if (a[i] >= f[maxl]) //如果比最长长度的序列的最后一个数字大 就可以更新长度了,这样是最优的 {maxl++;f[maxl] = a[i];} //没有办法更新最大长度 就在前面的数字中找,更新一下最后一个数字的最小值elsefor (int j = maxl-1; j >=0; j--) //从大到小更新这样保证是最大的jif (f[j] <= a[i]){f[j+1] = a[i];break;}}
}void output_ans()
{printf("%d\n",maxl);
}int main()
{//freopen("F:\\rush.txt","r",stdin);input_data();get_ans();output_ans();return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7632453.html

【u023】最长上升子序列(sequence)相关推荐

  1. 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence

    动态规划-最长公共子序列问题 Common Subsequence [ HDU - 1159 ] A subsequence of a given sequence is the given sequ ...

  2. LCS最长公共子序列和LIS最长上升子序列——例题剖析

    一.LCS最长公共子序列 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我) longest comment subsequence 模板题 longe ...

  3. 算法 求一个数组的最长递减子序列 C

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! //** ...

  4. HDU1159(dp最长公共子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Problem Description A subsequ ...

  5. JavaScript实现LongestIncreasingSubsequence最长递增子序列算法(附完整源码)

    JavaScript实现LongestIncreasingSubsequence最长递增子序列算法(附完整源码) dpLongestIncreasingSubsequence.js完整源代码 dpLo ...

  6. 动态规划(最长递增子序列)---最长摆动子序列

    最长摆动子序列 376. Wiggle Subsequence (Medium) 题目描述: 给定一个数组,求出其最长摆动子序列 Input: [1,7,4,9,2,5] Output: 6 The ...

  7. POJ3450 Corporate Identity —— 后缀数组 最长公共子序列

    题目链接:https://vjudge.net/problem/POJ-3450 Corporate Identity Time Limit: 3000MS   Memory Limit: 65536 ...

  8. 字符串最长公共子序列python_求解两个字符串的最长公共子序列

    一,问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence).比如字符串1:BDCABA:字符串2:ABCBDAB 则这两个字符串的最长公共子序列长 ...

  9. 最长递增子序列 子串_最长递增奇偶子序列

    最长递增子序列 子串 Problem statement: 问题陈述: Given a sequence of numbers you have to find out the length of t ...

  10. 最长递增子序列 子串_最长递增子序列

    最长递增子序列 子串 Description: 描述: This is one of the most popular dynamic programming problems often used ...

最新文章

  1. sklearn.preprocessing下的数据标准化(scale、MinMaxScaler)
  2. 华为5G首席科学家童文 | 5G:万物连接平台 智能世界基石
  3. 中以什么开头仅可注释单行_Python从入门到精通第006课--注释与变量
  4. IDEA创建mavenWeb项目笔记
  5. spring cloud连载第一篇之bootstrap context
  6. 今天正式开通51CTO技术博客
  7. java过滤器如何操作数据库_jsp – 使用Java中的过滤器验证用户名,密码(与数据库联系)...
  8. python 魔术方法
  9. Nexus搭建Maven私有仓库
  10. python 全局变量_python程序中用类变量代替global 定义全局变量
  11. ant vue 树形菜单横向显示_丝滑般 Vue 拖拽排序树形表格组件Vue-DragTreeTable
  12. Android NDK开发之 arm_neon.h文件ABI说明
  13. 一天天过得很快啊,今天大家都干了啥?我们拿出来晒晒
  14. 隐马尔科夫-维特比算法
  15. 基于PHP+MySQL游戏商城销售网站的设计与实现#计算机毕设
  16. php 时间日期转为时间戳,PHP日期格式转时间戳
  17. 打印机与计算机无法进行通讯,打印时电脑提示:“打印机不能与计算机进行通讯”是为什么啊?是电脑出现问题还是打印机出现问题了?...
  18. 怎么检查计算机和打印机是否连接网络,如何检查电脑中是否已成功连接网络打印机...
  19. 银行的压力测试如何进行?
  20. fluent瞬态计算终止条件在哪里设置_五.从卡门涡街看FLUENT设置依据

热门文章

  1. 卸载ruby on rails
  2. WinForm后台任务(定时任务)传递消息给主窗体并更新主窗体文本框内容
  3. 解决“未找到与约束CContractName Microsoft.Internal.VisualStudio”
  4. 仅对 LINQ to Entities 中已排序的输入支持方法“Skip”。必须在调用“Skip”方法之前调用方法“OrderBy”
  5. php怎么处理一对多,php - 如何处理内部连接以及与OOP的一对多关系? - SO中文参考 - www.soinside.com...
  6. oracle递归树查询
  7. org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state wo
  8. 大数据Hadoop学习记录(5)----Ubuntu16.4下安装配置HBase
  9. mybatis oracle 多条件批量删除_面试官经常喜欢问的Mybatis经典面试题,值得好好收藏哦!...
  10. 当前串口号不可以或被占用_原来团建是可以不占用私人时间当然,还可以拿加班费|不一样的团建...