LIS的三种求解方法
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的三种求解方法相关推荐
- 迷宫问题的三种求解方法(递归求解、回溯求解和队列求解)
目录 一.迷宫问题的三种求解方法 递归求解 回溯求解 队列求解 二.华为迷宫问题 一.迷宫问题的三种求解方法 在迷宫问题中,给定入口和出口,要求找到路径.本文将讨论三种求解方法,递归求解.回溯求解和队 ...
- Topk问题的三种求解方法
Topk问题的三种求解方法 什么是Topk问题 方法一:堆排序法 方法二:把N个数建堆,取出前k个 方法三:建一个k个数的堆 什么是Topk问题 其实顾名思义,这个问题也就是在N个数中找出前k个最值. ...
- LIS(最长上升子序列)问题的三种求解方法以及一些例题
摘要 本篇博客介绍了求LIS的三种方法,分别是O(n^2)的DP,O(nlogn)的二分+贪心法,以及O(nlogn)的树状数组优化的DP,后面给出了5道LIS的例题. LIS的定义 一个数的序列bi ...
- 乘法逆元的三种求解方法
目录 乘法逆元小结 逆元的定义 求解逆元的方法 1. 快速幂 测试代码 2.拓展欧几里得 测试代码 3.线性算法 例题 AC代码 乘法逆元小结 参考自:点击此处 乘法逆元,一般用于求(a / b)(m ...
- 一阶时滞微分方程三种求解方法的MATLAB实现及稳定性分析
前言: 大学期间只学习过<常微分方程>,没想到有些学校竟然还学<时滞微分方程>,于是找到一本由内藤敏机(日本)等著,马万彪等译的<时滞微分方程--泛函数微分方程引论> ...
- 二阶传递函数的推导及几种求解方法的比较
二阶系统是指那些可用二阶微分方程描述的系统,其电路形式是由两个独立动态元器件组成的电路. 二阶系统电路包括二阶低通电路.二阶高通电路.二阶带通电路和二阶带阻电路. 下面分别给出以上二阶系统传递函数的推 ...
- 外点罚函数法的MATLAB实现,一、非线性规划问题的几种求解方法1罚函数法(外点法).ppt...
您所在位置:网站首页 > 海量文档  > 高等教育 > 微积分 一.非线性规划问题的几种求解方法1罚函数法(外点法). ...
- PHP开发之递归算法的三种实现方法
递归算法对于任何一个编程人员来说,应该都不陌生.因为递归这个概念,无论是在PHP语言还是Java等其他编程语言中,都是大多数算法的灵魂.对于PHP新手来说,递归算法的实现原理可能不容易理解.但是只要你 ...
- 黑马程序员_Java解析网络数据流的三种特殊方法
Java解析网络数据流的三种特殊方法 Java作为最开放的语言,已越来越受到网络程序员的青睐.但这一青睐族有着同样的经历--曾经都为网络上通信的Java数据格式而烦恼. 笔者也不例外,曾经为此而查阅了 ...
最新文章
- 我竟然用OpenCV实现了卡尔曼滤波
- mysql两列数据去重_CiteSpace多数据库一键去重4.0-知网、万方、维普数据库
- 关于Jakarta EE软件包名称更改的思考
- 背计算机专业英语词汇,计算机专业英语词汇1500词(五)
- Hadoop实战之三~ Hello World
- 物体运动到一个点停止_教科版五年级上册第四单元运动和力复习要点
- 20145302张薇《Java程序设计》第三周学习总结
- Linux系统如何添加IP别名
- UE4启动GameActivity
- 详解Java的交互式编程环境:jshell
- 面试官看到一定会打我---软件测试工程师面试套路和暗语灵魂解密
- 数学分析 函数项级数(第13章)
- xss.haozi.me弹窗练习0x00-0x10
- 树莓派 pcf8591 AD转换模块使用
- c语言随机数字密码生成器,随机数生成器(浮点数整型数)
- 完成领导交代的任务并及时反馈,才叫真的完成任务
- 支持向量机(SVM)算法原理
- 如何在官网下载tomcat
- python之Numpy随机抽样
- ubuntu系统下quagga 安装[更新]
热门文章
- python 列表间隔取值_程序从Python中的间隔列表中查找最长间隔的长度
- 设置屏幕保护时的小妙招
- 字符串(str)相关的4个函数学习分享
- 54岁 Switch 最强破解团队成员提前释放,仍要还任天堂 1450 万美元 !
- 【如何在 Debian、Ubuntu 或 Linux Mint 上的 Google Chrome、Brave、Vivaldi 和 Opera 浏览器中启用硬件加速视频解码】
- 发布代码工具:Ubuntu Pastebin
- 提取bilibili网页视频目录,网页提取标签、属性,list到写入文本
- R语言ggplot2 | 告别AI和PS,地表最全R语言拼图
- 语音广播服务器,网络语音广播主机-文字语音转换设备 - 航天信广
- 国家自然科学基金生物与计算机结合,计算机学院凝方向育团队聚力国家自然科学基金申报...