AT_dp_q Flowers题解
题目描述
有 N 朵花排成一排。对于每个 i(1≤i≤N),从左往右第 i 朵花的高度为 hi,美丽值为 ai。其中 h1,h2,…,hN 互不相同。
太郎君想通过拔掉一些花,使得剩下的花满足以下条件:
- 从左到右看,剩下的花的高度严格递增。
请你求出剩下的花的美丽值总和的最大值。
输入格式
输入以如下格式从标准输入读入:
N
h1 h2 … hN
a1 a2 … aN
输出格式
请输出剩下的花的美丽值总和的最大值。
显示翻译
题意翻译
输入输出样例
输入 #1复制
4 3 1 4 2 10 20 30 40
输出 #1复制
60
输入 #2复制
1 1 10
输出 #2复制
10
输入 #3复制
5 1 2 3 4 5 1000000000 1000000000 1000000000 1000000000 1000000000
输出 #3复制
5000000000
输入 #4复制
9 4 2 5 8 3 6 1 7 9 6 8 8 4 6 3 5 7 5
输出 #4复制
31
说明/提示
限制条件
- 所有输入均为整数。
- 1≤N≤2×105
- 1≤hi≤N
- h1,h2,…,hN 互不相同。
- 1≤ai≤109
样例解释 1
保留从左到右第 2、4 朵花即可。此时高度依次为 1,2,满足严格递增。美丽值总和为 20+40=60。
样例解释 2
一开始就已经满足条件。
样例解释 3
答案可能超出 32 位整数范围。
样例解释 4
保留从左到右第 2、3、6、8、9 朵花即可。
由 ChatGPT 4.1 翻译
思路
DP即可。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,h[200005],a[200005];
long long a2[200005],u,x,y,k,f[200005],lk=0,kl=0;
long long lb(long long x){
return x&(-x);
}
void ci(long long x,long long d){
while(x<=n){
a2[x]=max(a2[x],d);
x+=lb(x);
}
}
long long co(long long x){
long long lks=0;
while(x>=1){
lks=max(lks,a2[x]);
x-=lb(x);
}
return lks;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>h[i];
}
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
f[i]=co(h[i]-1)+a[i];
ci(h[i],f[i]);
lk=max(lk,f[i]);
}
cout<<lk<<endl;
return 0;
}

浙公网安备 33010602011771号