思路:我们根据Dilworth定理可以发现本题就是LIS。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 30005;
int n, a[MAXN], dp[MAXN];
int main()
{
while(~scanf("%d", &n))
{
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
int len = 0;
for(int i = 0; i < n; i++)
{
int pos = lower_bound(dp, dp+len, a[i])-dp;
if (pos == len) dp[len++] = a[i];
else dp[pos] = a[i];
}
printf("%d\n", len);
}
return 0;
}
/*
8
389 207 155 300 299 170 158 65
*/
本文介绍了一个基于Dilworth定理的应用实例,通过最长递增子序列(LIS)算法解决特定问题。使用C++实现了一个简洁高效的程序,能够处理输入数据并输出最长递增子序列的长度。
6万+

被折叠的 条评论
为什么被折叠?



