先学习一下别人的东西:http://blog.csdn.net/fisher_jiang/article/details/2442348
以上的比较理论,下边写一个题目
- 题目大意:
这个题目的意思转换比较重要。原意是给定n个数,如果对于a > b,那么交换a、b(即冒泡排序的过程),此时在点a和点b之间加一条边。一直操作下去,最后可以得到一个图,求一下这个图的最大独立集。 - 分析:
最大独立集即这个集合中的每个点不能到达集合中的其他任意一个点,且最大。那么转换到题目中,即对于这个集合中的任意两个点,满足a < b,也就求一下最长上升子序列。然后结合一下题目的复杂度,需要的是 O(nlgn)的算法,也就是上边学过的。
int f[MAXN];
int main()
{
// freopen("in.txt", "r", stdin);
int n, t, cnt;
while (~RI(n))
{
cnt = 0;
REP(kase, n)
{
RI(t);
int ind = lower_bound(f, f + cnt, t) - f;
f[ind] = t;
//如果插入点在后边
if (ind == cnt)
{
cnt++;
}
}
cout << cnt << endl;
}
return 0;
}