洛谷原题
【解法】先按一边排序,去除后效性,再做LIS.
一个风格奇怪的代码
#include <iostream>
#include <algorithm>
#include <utility>
using namespace std;
//DP : Sort + LIS
int N, f[200010], ans(1);
pair<int, int> P[200010];
int main() {
cin >> N;
for(int i(1); !(i>N); ++i) cin >> P[i].first >> P[i].second;
sort(P+1, P+N+1);
for(int i(1); !(i>N); ++i) f[i] = 1;
for(int i(1); !(i>N); ++i)
for(int j(1); !(j>=i); ++j) {
if(P[j].second < P[i].second)
f[i] = max(f[i], f[j]+1);
ans = max(ans, f[i]);
}
cout << ans << endl;
return 0;
}
复习下二分LIS
#include <iostream>
#include <algorithm>
#include <utility>
using namespace std;
//DP : Sort + LIS(n logn);
pair<int, int> P[200010];
int N, LIS = 1, d[200010];
int main() {
cin >> N;
for(int i(1); !(i>N); ++i) cin >> P[i].first >> P[i].second;
sort(P+1, P+N+1);
d[LIS] = P[1].second;
for(int i(1); !(i>N); ++i) {
if(P[i].second > d[LIS]) d[++LIS] = P[i].second;
else {
int p = lower_bound(d+1, d+LIS, P[i].second) - d;
d[p] = P[i].second;
}
}
cout << LIS << endl;
return 0;
}