POJ-2533 Longest Ordered Subsequence

 2023-09-05 阅读 26 评论 0

摘要:http://poj.org/problem?id=2533 该题是最裸的LIS题,这里有两种方法。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>using namespace std;int a[10000], dp[10004];int main(){int N;while (scanf("%d",

http://poj.org/problem?id=2533

该题是最裸的LIS题,这里有两种方法。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int a[10000], dp[10004];

int main()
{
int N;
while (scanf("%d", &N) == 1)
{
int ans = 1, m;
for (int i = 0; i < N; ++i)
{
scanf("%d", a+i);
}
dp[0] = 1;
for (int i = 1; i < N; ++i)
{
m = 0;
for (int j = 0; j < i; ++j)
{
if (a[i] > a[j] && dp[j] > m)
{
m = dp[j];
}
}
dp[i] = m+1;
ans = max(ans, dp[i]);
}
printf("%d\n", ans);
}

}

二分优化后的写法,数组c[i]保留长度为i的上升串的末尾最小元素。

代码如下:

#include <cstdlib>
#include <cstring>
#include <cstdio>
#define MAXN 10000
using namespace std;

int a[MAXN+5];

int bsearch(int *c, int l, int r, int val)
{
int mid;
while (l <= r)
{
mid = (l+r)>>1;
if (val > c[mid])
l = mid + 1;
else if (val < c[mid])
r = mid - 1;
else // 如果不是严格的递增序列的话,二分查找时,相等视为后者比其大
return mid;
}
return l;
}

int LIS(int *a, int N)
{
int c[MAXN], size = 1, pos;
c[1] = a[0];
for (int i = 1; i < N; ++i)
{
if (a[i]>c[size])
pos = ++size;
else
pos = bsearch(c, 1, size, a[i]);
// 返回比该值稍微大的点
c[pos] = a[i];
}
return size;
}

int main()
{
int N;
while (scanf("%d", &N) == 1)
{
for (int i = 0; i < N; ++i)
{
scanf("%d", &a[i]);
}
printf("%d\n", LIS(a, N));
}
}




版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/2323.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息