您的位置:首页 > 其它

51nod 1134 最长递增子序列

2016-03-07 16:14 351 查看
二分+dp

#include <iostream>
#include <cstring>
#include <cstdio>

const int MAX = 5e4 + 5;
int arr[MAX];
int dp[MAX];

int binary_search(int arr[], int lenth, int val)
{
int l = 0, r = lenth - 1;
while (l <= r)
{
int m = (l + r) >> 1;
if (arr[m] <= val)
l = m + 1;
else
r = m - 1;
}

return l;
}

int main()
{
int num;
scanf("%d", &num);
for (int i = 0; i != num; ++i)
{
scanf("%d", &arr[i]);
}
int max_lenth = 0;
dp[max_lenth] = arr[0];
for (int i = 1; i < num; ++i)
{
if (arr[i] > dp[max_lenth])
{
dp[++max_lenth] = arr[i];
}
else
{
int tmp = binary_search(dp, max_lenth + 1, arr[i]);
dp[tmp] = arr[i];
}
}
printf ("%d\n", max_lenth + 1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: