#1#4#8WA单调队列优化dp求调
查看原帖
#1#4#8WA单调队列优化dp求调
482007
TanX_1e18楼主2023/7/5 16:37
#include<bits/stdc++.h>
using namespace std;
int t,maxp,w,ap[2009],bp[2009],as[2009],bs[2009],f[2009][2009],ans;
int q1[2309],h1,d1;
int q2[2309],h2,d2;
int main()
{
	cin>>t>>maxp>>w;
	for(int i=0;i<=t;i++)
	for(int j=0;j<=maxp;j++)
	f[i][j]=-1e9;
	f[0][0]=0;
	for(int i=1;i<=t;i++)
	{
		cin>>ap[i]>>bp[i]>>as[i]>>bs[i];
		for(int j=0;j<=maxp+200;j++)
		q1[j]=q2[j]=0;
		h1=1;h2=1;d1=0;d2=0;
		for(int j=0;j<=maxp;j++)
		{
			f[i][j]=f[i-1][j];
			if(j<=as[i])
			f[i][j]=max(f[i][j],-ap[i]*j);
			if(i-w-1>=0)
			{
				while(h1<=d1&&q1[h1]<j-as[i]) h1++;
				while(h1<=d1&&f[i-w-1][q1[d1]]+q1[d1]*ap[i]<f[i-w-1][j])d1--;
				q1[++d1]=j;
				f[i][j]=max(f[i][j],f[i-w-1][q1[h1]]+q1[h1]*ap[i]-j*ap[i]);
			}
		}
		for(int j=maxp;j>=0;j--)
		{
			if(i-w-1>0)
			{
				while(h2<=d2&&q2[h2]>j+bs[i]) h2++;
				while(h2<=d2&&f[i-w-1][q2[d2]]+q2[d2]*bp[i]<f[i-w-1][j])d2--;
				q2[++d2]=j;
				f[i][j]=max(f[i][j],f[i-w-1][q2[h2]]+q2[h2]*bp[i]-j*bp[i]);
			}
			ans=max(ans,f[i][j]);
		}
	}
	cout<<ans;
	return 0;
}
2023/7/5 16:37
加载中...