1.  O(n^2)

传统的求解方法 ,思路为dp,状态转移方程为 dp[i]=max( dp[j]+1,1)

即到目前的i为止,对前面出现的a[j](j<i)进行遍历 ,如果出现了a[i]>a[j]的情况 ,就使用状态转移方程。

转移方程代表了两种可能 ,第一种为第i个元素自己成为一个上升的队列  ,或者是由于前面的a[j]<a[i]  所以在

dp[j]的基础之上形成了dp[i] = dp[j]+1  但前提是a[i]>a[j]

# include <stdio.h>
int a[500];
int dp[500];
int maxx=1;
int n;
void lis(){for(int i=0;i<n;i++){dp[i]=1;for(int j=0;j<i;j++){if(a[i]>a[j]){if(dp[i]<dp[j]+1){dp[i]=dp[j]+1;}}}if(dp[i]>maxx)maxx=dp[i];}
}
void output(){for(int i=n;i>=0;i--){if(dp[i]==maxx){printf("%d--",a[i]);maxx--;}}
}
int main(){while(scanf("%d",&n)!=EOF){maxx = 1;for(int i=0;i<n;i++){scanf("%d",&a[i]);}lis();printf("最大的长度为%d\n",maxx);output();}return 0;
}

2. 第二种方法 LIS+LCS 把原序列与从小到大排序后的序列做LCS(最长公共子序列),就能求出LIS

顺便写了一下快排 还有可以再开一个数组来记录求LCS的路径 来解决输出的问题

# include<stdio.h>
# include<string.h>
int n;
int a[500];
int b[500];
int dp[500][500];
int res[500][500];
void swap(int *a,int i,int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;
}
void qsort(int *a,int left,int right){if(left>=right) return ;int len = left+1;for(int i=left+1;i<=right;i++){if(a[i]<a[left]){swap(a,i,len);len++;}}len--;swap(a,left,len);qsort(a,left,len-1);qsort(a,len+1,right);
}
void LCS(){memset(dp,0,sizeof(dp));memset(res,0,sizeof(res));for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(a[i-1]==b[j-1]){dp[i][j]=dp[i-1][j-1]+1;res[i][j]=1;}else if(dp[i-1][j]>dp[i][j-1]){dp[i][j]=dp[i-1][j];res[i][j]=2;}else {dp[i][j]=dp[i][j-1];res[i][j]=3;}}}
}
int main(){while(scanf("%d",&n)!=EOF){for(int i=0;i<n;i++){scanf("%d",&a[i]);b[i]=a[i];}qsort(a,0,n-1);printf("最长上升子序列为:");for(int i=0;i<n;i++){printf("%d  ",a[i]);}LCS();printf("\nLIS的长度为:");printf("%d\n",dp[n][n]);int i=n,j=n;int len=dp[n][n];while(len){if(res[i][j]==1){printf("%d  ",a[i-1]);i--;j--;len--;}else if(res[i][j]==2){i--;}else if(res[i][j]==3){j--;}}}return 0;
}

3.第三种方法 也是最快的方法 ,O(nlogn) dp+二分

思路: dp[i] 所表示的意思为 在如果LIS的长度为i的话 dp[i]所保存的就是长度为i的LIS的末尾数最小的值

但是这个算法有些问题 就是他求LIS的速度是非常快的 但是如果要输出LIS的话 貌似有点困难

# include <stdio.h>
int n;
int a[500];
int dp[500];
int main(){while(scanf("%d",&n)!=EOF){for(int i=0;i<n;i++){scanf("%d",&a[i]);}dp[1]=a[0];int len =1;for(int i=1;i<n;i++){int left=1;int right=len;while(left<=right){int mid = (left+right)/2;if(a[i]<dp[mid]) right= mid-1;else left=mid+1;}dp[left] = a[i];if(left>len) len++;}printf("%d\n",len);}return 0;
}

LIS的三种求解方法相关推荐

  1. 迷宫问题的三种求解方法(递归求解、回溯求解和队列求解)

    目录 一.迷宫问题的三种求解方法 递归求解 回溯求解 队列求解 二.华为迷宫问题 一.迷宫问题的三种求解方法 在迷宫问题中,给定入口和出口,要求找到路径.本文将讨论三种求解方法,递归求解.回溯求解和队 ...

  2. Topk问题的三种求解方法

    Topk问题的三种求解方法 什么是Topk问题 方法一:堆排序法 方法二:把N个数建堆,取出前k个 方法三:建一个k个数的堆 什么是Topk问题 其实顾名思义,这个问题也就是在N个数中找出前k个最值. ...

  3. LIS(最长上升子序列)问题的三种求解方法以及一些例题

    摘要 本篇博客介绍了求LIS的三种方法,分别是O(n^2)的DP,O(nlogn)的二分+贪心法,以及O(nlogn)的树状数组优化的DP,后面给出了5道LIS的例题. LIS的定义 一个数的序列bi ...

  4. 乘法逆元的三种求解方法

    目录 乘法逆元小结 逆元的定义 求解逆元的方法 1. 快速幂 测试代码 2.拓展欧几里得 测试代码 3.线性算法 例题 AC代码 乘法逆元小结 参考自:点击此处 乘法逆元,一般用于求(a / b)(m ...

  5. 一阶时滞微分方程三种求解方法的MATLAB实现及稳定性分析

    前言: 大学期间只学习过<常微分方程>,没想到有些学校竟然还学<时滞微分方程>,于是找到一本由内藤敏机(日本)等著,马万彪等译的<时滞微分方程--泛函数微分方程引论> ...

  6. 二阶传递函数的推导及几种求解方法的比较

    二阶系统是指那些可用二阶微分方程描述的系统,其电路形式是由两个独立动态元器件组成的电路. 二阶系统电路包括二阶低通电路.二阶高通电路.二阶带通电路和二阶带阻电路. 下面分别给出以上二阶系统传递函数的推 ...

  7. 外点罚函数法的MATLAB实现,一、非线性规划问题的几种求解方法1罚函数法(外点法).ppt...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp高等教育&nbsp>&nbsp微积分 一.非线性规划问题的几种求解方法1罚函数法(外点法). ...

  8. PHP开发之递归算法的三种实现方法

    递归算法对于任何一个编程人员来说,应该都不陌生.因为递归这个概念,无论是在PHP语言还是Java等其他编程语言中,都是大多数算法的灵魂.对于PHP新手来说,递归算法的实现原理可能不容易理解.但是只要你 ...

  9. 黑马程序员_Java解析网络数据流的三种特殊方法

    Java解析网络数据流的三种特殊方法 Java作为最开放的语言,已越来越受到网络程序员的青睐.但这一青睐族有着同样的经历--曾经都为网络上通信的Java数据格式而烦恼. 笔者也不例外,曾经为此而查阅了 ...

最新文章

  1. 我竟然用OpenCV实现了卡尔曼滤波
  2. mysql两列数据去重_CiteSpace多数据库一键去重4.0-知网、万方、维普数据库
  3. 关于Jakarta EE软件包名称更改的思考
  4. 背计算机专业英语词汇,计算机专业英语词汇1500词(五)
  5. Hadoop实战之三~ Hello World
  6. 物体运动到一个点停止_教科版五年级上册第四单元运动和力复习要点
  7. 20145302张薇《Java程序设计》第三周学习总结
  8. Linux系统如何添加IP别名
  9. UE4启动GameActivity
  10. 详解Java的交互式编程环境:jshell
  11. 面试官看到一定会打我---软件测试工程师面试套路和暗语灵魂解密
  12. 数学分析 函数项级数(第13章)
  13. xss.haozi.me弹窗练习0x00-0x10
  14. 树莓派 pcf8591 AD转换模块使用
  15. c语言随机数字密码生成器,随机数生成器(浮点数整型数)
  16. 完成领导交代的任务并及时反馈,才叫真的完成任务
  17. 支持向量机(SVM)算法原理
  18. 如何在官网下载tomcat
  19. python之Numpy随机抽样
  20. ubuntu系统下quagga 安装[更新]

热门文章

  1. python 列表间隔取值_程序从Python中的间隔列表中查找最长间隔的长度
  2. 设置屏幕保护时的小妙招
  3. 字符串(str)相关的4个函数学习分享
  4. 54岁 Switch 最强破解团队成员提前释放,仍要还任天堂 1450 万美元 !
  5. 【如何在 Debian、Ubuntu 或 Linux Mint 上的 Google Chrome、Brave、Vivaldi 和 Opera 浏览器中启用硬件加速视频解码】
  6. 发布代码工具:Ubuntu Pastebin
  7. 提取bilibili网页视频目录,网页提取标签、属性,list到写入文本
  8. R语言ggplot2 | 告别AI和PS,地表最全R语言拼图
  9. 语音广播服务器,网络语音广播主机-文字语音转换设备 - 航天信广
  10. 国家自然科学基金生物与计算机结合,计算机学院凝方向育团队聚力国家自然科学基金申报...