NYOJ 214 单调递增子序列(二)
2015-07-02 22:43
246 查看
#include<stdio.h>
#include<string.h>
const int maxn=100001;
int dp[maxn],a[maxn];
int Binary_search(int len,int k)
{
// 查找比第一个比dp[i]小或者是相等的位置
int start,end,mid;
start=1;
end=len;
while(start<=end)
{
mid=(start+end)>>1;
if(k==dp[mid])
return mid;
if(k>dp[mid])
start=mid+1;
else
end=mid-1;
}
return start;
}
int main()
{
int n,i,t,len;
while(scanf("%d",&n)!=EOF)
{
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
len=1;
dp[1]=a[0];
for(i=1;i<n;i++)
{
t=Binary_search(len,a[i]);// 通过二分搜索查找要插入的位置
dp[t]=a[i]; // 更新dp的值
if(t>len) //如果插入的位置在最后,更新最大的长度
len=t;
}
printf("%d\n",len);
}
}
#include<string.h>
const int maxn=100001;
int dp[maxn],a[maxn];
int Binary_search(int len,int k)
{
// 查找比第一个比dp[i]小或者是相等的位置
int start,end,mid;
start=1;
end=len;
while(start<=end)
{
mid=(start+end)>>1;
if(k==dp[mid])
return mid;
if(k>dp[mid])
start=mid+1;
else
end=mid-1;
}
return start;
}
int main()
{
int n,i,t,len;
while(scanf("%d",&n)!=EOF)
{
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
len=1;
dp[1]=a[0];
for(i=1;i<n;i++)
{
t=Binary_search(len,a[i]);// 通过二分搜索查找要插入的位置
dp[t]=a[i]; // 更新dp的值
if(t>len) //如果插入的位置在最后,更新最大的长度
len=t;
}
printf("%d\n",len);
}
}
相关文章推荐
- Windows API贪吃蛇游戏
- Python 2.7.9 Demo - JSON的编码、解码
- BZOJ 2038 小Z的袜子(hose)(分块暴力)
- opencv学习日常之随机数发生器RNG
- cubieboard 资源
- 用递归方法计算行列式的值
- phpcms 添加顶踩功能
- java求两个数的最大公约数和最小公倍数
- 欢迎使用CSDN-markdown编辑器
- LeetCode_Disjoint-Set_Longest Consecutive Sequence
- Android基础之ListView的使用详解
- Javascript为元素添加事件处理函数
- 微软自带的Serialization和Newtonsoft简单测试
- 海伦公式 C++代码
- #猜猜看#连接数据库计算猜对次数猜错次数
- js 刷新页面
- iframe父子兄弟之间调用传值(contentWindow && parent)
- mysql安装时报start service错。解决办法~
- 黑马程序员——2,零碎的JAVA基础
- MVC三层架构