ATC DP Q - Flowers
https://atcoder.jp/contests/dp/tasks/dp_q
参考最长上升子序列,这样做事 O ( n 2 ) O(n^2) O(n2)
后来发现只需要从比当前高度小的里面挑出来那个美丽值最大的就好了,然后以高度为界限维护美丽值的最大值就好了。
可以用树状数组或者线段树。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <unordered_map>
using namespace std;
const int N = 1e6 + 100;
const int mod = 1e9 + 7;
typedef long long ll;
typedef ll ll;
ll a[N], h[N];
ll dp[N], tree[N + 1];
ll lowbit(ll x) {
return x & (-x);
}
void update(ll i, ll k) { //在i位置加上k
while (i <= N) {
tree[i] = max(tree[i], k);
i = i + lowbit(i);
}
}
ll query(ll i) {
ll res = 0;
while (i > 0) {
res = max(res, tree[i]);
i = i - lowbit(i);
}
return res;
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> h[i];
}
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
ll maxn = 0;
for (int i = 1; i <= n; i++) {
dp[i] = a[i] + query(h[i]);
maxn = max(maxn, dp[i]);
update(h[i], dp[i]);
}
cout << maxn << endl;
}