P2519 [HAOI2011]problem a
阿新 • • 發佈:2018-10-31
Solution
有人比它高, 有人比它低.
那麼就確定了和他相等的.
於是每一個人是一個區間.
問題轉化為了確定最多的區間且不交.
Code
#include <algorithm> #include <iostream> #include <stdio.h> #include <vector> #include <map> using namespace std; const int N = 100006; int f[N]; vector<int> p[N]; map<pair<int, int>, int>S; int main() { int n; scanf("%d", &n); for (int i = 1, l, r; i <= n; i += 1) { scanf("%d%d", &l, &r); l += 1, r = n - r; if (l > r) continue; if (not S.count(make_pair(l, r))) p[r].push_back(l); S[make_pair(l, r)] += 1; } for (int i = 1; i <= n; i += 1) { f[i] = f[i - 1]; for (auto j : p[i]) f[i] = max(f[i], f[j - 1] + min(i - j + 1, S[make_pair(j, i)])); } printf("%d\n", n - f[n]); return 0; }