【题解】CF1146G Zoning Restrictions

Sol

题解区好像都是网络流的题解,这里给一篇区间 dp 的题解。
思路 by e3c8f1a924
发现数据范围很小,考虑区间 dp。
容易发现,一个限制只与该区间内最高的房屋有关。
那么记 dp(l,r,k) 表示 区间 [l,r] 中最高房屋为 k 时的最大收益。
转移的话对于每个区间找出所有完全被这个区间包含的限制。然后暴力枚举最高的房屋进行转移。在用前缀 max 优化即可。
具体实现看代码。
时间复杂度 O(n3h)

Code

//LYC_music yyds!
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0)
#define lowbit(x) (x&(-x))
using namespace std;
inline char gc()
{
	static char buf[1000000],*p1=buf,*p2=buf;
	return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
int read()
{
	int pos=1,num=0;
	char ch=getchar();
	while (!isdigit(ch))
	{
		if (ch=='-') pos=-1;
		ch=getchar();
	}
	while (isdigit(ch))
	{
		num=num*10+(int)(ch-'0');
		ch=getchar();
	}
	return pos*num;
}
void write(int x)
{
	if (x<0)
	{
		putchar('-');
		write(-x);
		return;
	}
	if (x>=10) write(x/10);
	putchar(x%10+'0');
}
void writesp(int x)
{
	write(x);
	putchar(' ');
}
void writeln(int x)
{
	write(x);
	putchar('\n');
}
const int N=60;
int n,h,m,L[N],R[N],x[N],c[N],id[N],dp[N][N][N];
signed main()
{
	n=read(); h=read(); m=read();
	for (int i=1;i<=m;i++)
		L[i]=read(),R[i]=read(),x[i]=read(),c[i]=read(),id[i]=i;
	sort(id+1,id+m+1,[](int a,int b)
	{
		return x[a]>x[b];
	});
	for (int i=1;i<=n;i++)
	{
		vector<int> G;
		for (int j=1;j<=m;j++)
			if (L[id[j]]==i&&R[id[j]]==i) G.emplace_back(id[j]);
		int tot=0,cnt=(int)G.size()-1;
		for (int j=0;j<=h;j++)
		{
			while (cnt>=0&&j>x[G[cnt]]) tot+=c[G[cnt]],cnt--;
			dp[i][i][j]=j*j-tot;
			if (j>0) dp[i][i][j]=max(dp[i][i][j],dp[i][i][j-1]); 
		}
	}
	for (int len=2;len<=n;len++)
		for (int l=1;l<=n-len+1;l++)
		{
			int r=l+len-1;
			for (int k=l;k<=r;k++)
			{
				vector<int> G;
				for (int j=1;j<=m;j++)
					if (L[id[j]]>=l&&r>=R[id[j]]&&L[id[j]]<=k&&R[id[j]]>=k) G.emplace_back(id[j]);
				int tot=0,cnt=(int)G.size()-1;
				for (int i=0;i<=h;i++)
				{
					while (cnt>=0&&i>x[G[cnt]]) tot+=c[G[cnt]],cnt--;
					dp[l][r][i]=max(dp[l][r][i],dp[l][k-1][i]+dp[k+1][r][i]+i*i-tot);
				}
			}
			for (int i=1;i<=h;i++)
				dp[l][r][i]=max(dp[l][r][i],dp[l][r][i-1]);
		}
	writeln(dp[1][n][h]);
}

 


posted @   dd_d  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
主题色彩