[DP] Luogu2782 友好城市

洛谷原题
【解法】先按一边排序,去除后效性,再做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;
}

猜你喜欢

转载自blog.csdn.net/Binary_Heap/article/details/79328463