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;
}
posted @ 2025-07-07 17:27  长安一片月_22  阅读(14)  评论(0)    收藏  举报