博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长上升子序列的两种求法 POJ 2533
阅读量:3905 次
发布时间:2019-05-23

本文共 995 字,大约阅读时间需要 3 分钟。

最长上升子序列一共有两种求法:

1.dp,也可以说的纯暴力吧。

dp[i]表示以a[i]为结尾的最长上升子序列的长度。

所以只要满足j<i且a[j]<a[i],则一定满足dp[j]=max(dp[j],dp[i]+1);

复杂度为n^2;

2.是在上述方法的优化,建一个dp数组。

dp[i]表示长度为i的上升子序列中末尾元素的最小值。

因为dp数组一定是有序的,这样每次插入元素的时候可以结合二分查找使效率更高。

复杂度为logn*n;

例题为poj 2533

1.第一种方法:

#include 
#include
#include
#include
using namespace std;const int maxn=1e3+5;int n;int a[maxn];int dp[maxn];int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=n;i++) dp[i]=1; int Max=1; for (int i=1;i<=n;i++) { for (int j=i+1;j<=n;j++) { if(a[i]

注意初始化Max=1。

2.第二种方法:

#include 
#include
#include
#include
using namespace std;const int maxn=1e3+5;int n;int a[maxn];int dp[maxn];int len;int main(){ scanf("%d",&n); len=0; for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=n;i++) { int loc=lower_bound(dp,dp+len,a[i])-dp; if(loc==len) dp[len++]=a[i]; else { dp[loc]=a[i]; } } printf("%d\n",len); return 0;}

 

转载地址:http://bkoen.baihongyu.com/

你可能感兴趣的文章
面向对象设计案例——点和圆关系
查看>>
深拷贝与浅拷贝
查看>>
WinForm 打开txt文件
查看>>
WinForm 实现日志记录功能
查看>>
WinForm 读取照片文件
查看>>
WinForm ComboBox不可编辑与不可选择
查看>>
WinForm textbox控件设置为不可编辑
查看>>
winForm ImageList图像控件使用
查看>>
WinForm TabControl标签背景色
查看>>
Winform TabControl标签美化
查看>>
打印日志类
查看>>
WinForm 获取文件/文件夹对话框
查看>>
PyCharm打包.exe遇到的问题
查看>>
winform中添加Windows Media Player
查看>>
345. 反转字符串中的元音字母
查看>>
67. 二进制求和
查看>>
125. 验证回文串
查看>>
168. Excel表列名称
查看>>
400. 第N个数字
查看>>
209. 长度最小的子数组
查看>>