您的位置:首页 > 其它

LIS O(nlgn)最简写法

2016-03-16 13:25 155 查看
挑战上一个LIS的写法真的好短,,,

利用了STL的fill,lower_bound

1.这里注意fill,memset的区别

memset是按字节填充的,初始化的时候只能初始化为0,-1,不能为1或其他

例如当memset int 初始化为1时,则为

(1<<24)+(1<<16)+(1<<8)+1=16843009

fill是把某一区域赋值

2.lower_bound:找出第一个a[i]<=k的值

   upper_bound:找出第一个a[i]>k的值

求长度为n的有序数组a中k的个数:upper_bound(a,a+n,k)-lower_bound(a,a+n,k)

#include<stdio.h>
#include<string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=99999999;
int dp[100],a[100];
int n;
void solve()
{
fill(dp,dp+n,INF);
for(int i=0;i<n;i++)
*lower_bound(dp,dp+n,a[i])=a[i];
cout<<lower_bound(dp,dp+n,INF)-dp;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp