dp专题5 题解
A CF833B
容易想到统计上一次出现该颜色的位置,然后维护 50 个支持区间加和全局最大值的线段树,用以优化 dp。
时间复杂度 \(O(nk\log n)\)。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=35005;
struct segment{
int mx[N*4],ad[N*4];
void down(int x,int k){mx[x]+=k,ad[x]+=k;}
void push_down(int x){
down(x*2,ad[x]),down(x*2+1,ad[x]),ad[x]=0;
}void add(int x,int l,int r,int L,int R,int k){
if(L>R) return;
if(L<=l&&r<=R) return down(x,k);
int mid=(l+r)/2;push_down(x);
if(L<=mid) add(x*2,l,mid,L,R,k);
if(R>mid) add(x*2+1,mid+1,r,L,R,k);
mx[x]=max(mx[x*2],mx[x*2+1]);
}
}seg[55];int n,k,ls[N];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>k;
for(int i=1,a,l;i<=n;i++){
cin>>a,l=ls[a],ls[a]=i;
for(int j=min(i,k);j>1;j--){
seg[j].add(1,1,n,i,i,seg[j-1].mx[1]);
seg[j].add(1,1,n,l+1,i,1);
}seg[1].add(1,1,n,l+1,i,1);
}cout<<seg[k].mx[1];
return 0;
}
B CF922E
考虑背包 dp,以鸟的个数为值域,维护收下这么多鸟后,最大的魔力值。最后从小到大枚举,找到最后一个魔力值为自然数的即可。
时间复杂度 \(O(n\sum c+(\sum c)^2)\)。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,b,x,w,f[10005],cs[1005],c[1005];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
memset(f,-1,sizeof(f));
cin>>n>>w>>b>>x,f[0]=w;
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1;i<=n;i++) cin>>cs[i];
for(int i=1,sum=c[i];i<=n;sum+=c[++i])
for(int j=sum;~j;j--) for(int k=j;k>=j-c[i];k--)
if(~f[k]) f[j]=max(f[j],min(f[k]+x,w+b*k)-cs[i]*(j-k));
for(int i=1;;i++) if(f[i]<0) cout<<i-1,exit(0);
return 0;
}

浙公网安备 33010602011771号