题意:对一个序列冒泡排序,交换(a[i], a[j])的时候对i, j建一条边,问最小的独立点集是什么
题解:直接建边n*n, 可以发现,独立集的每一个点都是没有边和其他点相连的,而只要a[i]>a[j]就代表i, j有关系,那么a[i]<a[j]就代表i, j没有关系,也就是找到最多的点没有关系 == 最长上升子序列.....
#include <bits/stdc++.h> #define ll long long #define maxn 100100 #define INF 0x7f7f7f7f using namespace std; int a[maxn], dp[maxn], n, t, ans; int main(){ scanf("%d", &n); for(int i=0;i<n;i++) scanf("%d", &a[i]); memset(dp, INF, sizeof(dp)); for(int i=0;i<n;i++){ t = lower_bound(dp+1, dp+n+1, a[i])-dp; ans = max(ans, t); dp[t] = a[i]; } printf("%d ", ans); return 0; }