CF2000F Color Rows and Columns 题解
CF2000F Color Rows and Columns 题解
题目大意#
给定 个矩形,第 个矩形规格为 。对这些矩形的单元格涂色,若一个矩形的一行或一列都被涂上了色,则获得 的价值。求获得 价值至少要涂多少个单元格。
Solve#
考虑 dp。
设 表示前 个矩形,恰好获得 价值的最小代价。如何状态转移?
如果我钦定第 个矩形中恰好获得 价值,即涂满的行和列之和为 ,最小代价 是多少?
考虑枚举涂了 列, 行,则代价为 ,要减去重叠部分。此表达式形如二次函数,复杂度允许,故枚举 找到代价最小值 即可。
有状态转移:。时间复杂度 。
Code#
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read()
{
short f=1;
int x=0;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
const int N=1010,M=110;
int t,n,m,a,b,f[N][M];
signed main()
{
t=read();
while(t--)
{
n=read();m=read();
for(int i=0;i<=n;i=-~i)
for(int j=1;j<=m;j=-~j)
f[i][j]=1e18;
for(int i=1;i<=n;i=-~i)
{
a=read();b=read();
for(int j=0;j<=m&&j<=a+b;j=-~j)
{
int mn=1e18;
for(int k=max(0ll,j-a);k<=j&&k<=b;k=-~k)
mn=min(mn,k*a+(j-k)*b-k*(j-k));
for(int k=j;k<=m;k=-~k)
f[i][k]=min(f[i][k],f[i-1][k-j]+mn);
}
}
printf("%lld\n",f[n][m]==1e18?-1ll:f[n][m]);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2023-08-15 P3629 巡逻 LCA题解