HDU 1950(Bridging signals)最长不降子序列nlogn
2015-06-24 08:16
309 查看
这个题和HDU1025异曲同工,一个意思,就是求最长不降子序列。
代码:
#include<stdio.h>
#include<string.h>
int BinSearch(int key,int* d,int left,int right)
{
int mid;
while(left<=right)
{
mid=(left+right)/2;
if(key>d[mid])
{
if(key<=d[mid+1]) return mid;
else left=mid+1;
}
else right=mid-1;
}
return 0;
}
int main()
{
int n;
int a[40001],d[40001];
int i,j,len;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(a,0,sizeof(a));
memset(d,0,sizeof(d));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
len=1;
d[len]=a[0];
for(i=1;i<n;i++)
{
if(a[i]>d[len])
{
len++;
j=len;
}
else
{
j=BinSearch(a[i],d,1,len);
j++;
}
d[j]=a[i];
}
printf("%d\n",len);
}
return 0;
}
代码:
#include<stdio.h>
#include<string.h>
int BinSearch(int key,int* d,int left,int right)
{
int mid;
while(left<=right)
{
mid=(left+right)/2;
if(key>d[mid])
{
if(key<=d[mid+1]) return mid;
else left=mid+1;
}
else right=mid-1;
}
return 0;
}
int main()
{
int n;
int a[40001],d[40001];
int i,j,len;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(a,0,sizeof(a));
memset(d,0,sizeof(d));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
len=1;
d[len]=a[0];
for(i=1;i<n;i++)
{
if(a[i]>d[len])
{
len++;
j=len;
}
else
{
j=BinSearch(a[i],d,1,len);
j++;
}
d[j]=a[i];
}
printf("%d\n",len);
}
return 0;
}
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 动态规划
- C++ 动态规划
- DP(动态规划) 解游轮费用问题
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 关于爬楼梯的动态规划算法
- 动态规划 --- hdu 1003 **
- DP问题各种模型的状态转移方程
- 0-1背包解题过程
- USACO 3.2.2:Stringsobits
- 字符串编辑距离
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- ACM常用算法
- 01背包问题