【算法】区间DP

【题意】平面上有n个点(xi,yi),用最少个数的底边在x轴上且面积为S的矩形覆盖这些点(在边界上也算覆盖),n<=100。

【题解】随机大数据下,贪心几乎没有错误,贪心出奇迹啊!

f[i][j][h]表示区间i~j高度>=h的点全部被覆盖的最少矩形。

首先离散化横纵坐标,然后初始化每个f[i][i],然后进行区间DP(顺次枚举区间长度,左端点,高度从大到小)转移如下。

f[i][j][h]=min(f[i][j][h],f[i][x][h]+f[x+1][j][h]),x=i~j-1

h2=s/(x[j]-x[i])(注意离散化)

f[i][j][h]=min(f[i][j][h],f[i][j][h2+1]+1)

为什么这样转移是正确的?

考虑一个区间内情况,有以下两种选择:

1.分成两个区间各自摆矩形并列。

2.在整个区间设置打矩形,则h2部分另外处理。

其它情况?直接在区间摆大矩形覆盖全部等价于第二种情况,大区间h之上只有小区间的点等价于第一种情况,所以一共只有两种情况。

#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
int read()
{
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
/*------------------------------------------------------------*/
const int inf=0x3f3f3f3f,maxn=;
struct cyc{int x,y;}a[maxn],b[maxn],c[maxn];
int n,f[maxn][maxn][maxn],ynum[maxn],tot,s;
bool cmp(cyc a,cyc b)
{return a.x<b.x||(a.x==b.x&&a.y>b.y);}
int main()
{
scanf("%d%d",&n,&s);
for(int i=;i<=n;i++){
a[i].x=read();
a[i].y=read();
}
sort(a+,a+n+,cmp);
int totx=;
c[totx]=a[];
for(int i=;i<=n;i++)if(a[i].x!=a[i-].x)c[++totx]=a[i];
tot=n=totx;
for(int i=;i<=n;i++)a[i]=c[i];
for(int i=;i<=n;i++)ynum[i]=a[i].y;
sort(ynum+,ynum+tot+);
tot=unique(ynum+,ynum+tot+)-ynum-;
for(int i=;i<=n;i++){b[i].x=i;b[i].y=lower_bound(ynum+,ynum+tot+,a[i].y)-ynum;}
ynum[++tot]=inf;
memset(f,0x3f,sizeof(f));
for(int i=;i<=n;i++){for(int k=tot;k>b[i].y;k--)f[i][i][k]=;for(int k=b[i].y;k>=;k--)f[i][i][k]=;}
for(int p=;p<=n;p++){
for(int i=;i+p-<=n;i++){
int j=i+p-;
for(int h=tot;h>=;h--){
for(int x=i;x<j;x++)f[i][j][h]=min(f[i][j][h],f[i][x][h]+f[x+][j][h]);
int h2=lower_bound(ynum+,ynum+tot+,s/(a[j].x-a[i].x))-ynum;
if(ynum[h2]==s/(a[j].x-a[i].x))h2++;
f[i][j][h]=min(f[i][j][h],f[i][j][h2]+);
}
}
}
printf("%d",f[][n][]);
return ;
}

【STSRM10】dp只会看规律的更多相关文章

  1. 汕头市队赛 SRM10 dp只会看规律 && bzoj1766

    dp只会看规律 SRM 10 描述 平面上有n个点(xi,yi),用最少个数的底边在x轴上且面积为S的矩形覆盖这些点(在边界上也算覆盖) 输入格式 第一行两个整数n,S接下来n行每行两个整数xi,yi ...

  2. [LOJ#516]「LibreOJ β Round #2」DP 一般看规律

    [LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...

  3. LibreOJ #516. 「LibreOJ β Round #2」DP 一般看规律

    二次联通门 : LibreOJ #516. 「LibreOJ β Round #2」DP 一般看规律 /* LibreOJ #516. 「LibreOJ β Round #2」DP 一般看规律 set ...

  4. Pycharm新手教程,只需要看这篇就够了

    pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版 ...

  5. 2018.10.14 loj#516. DP 一般看规律(启发式合并)

    传送门 注意到一种颜色改了之后就不能改回去了. 因此可以启发式合并. 每次把小的合并给大的. 这样每个数最多被合并logloglog次. 如果维护一棵比较下标的平衡树的话,对于答案有贡献的就是每个数与 ...

  6. loj516 「LibreOJ β Round #2」DP 一般看规律

    传送门:https://loj.ac/problem/516 [题解] 那段代码求的是相同的数中间隔最小的值. 离散后用set维护每个值出现次数,每次操作相当于合并两个set,这步可以启发式合并. 加 ...

  7. 「LibreOJ#516」DP 一般看规律

    首先对于序列上一点,它对答案的贡献只有与它的前驱和后驱(前提颜色相同)构成的点对, 于是想到用set维护每个颜色,修改操作就是将2个set暴力合并(小的向大的合并),每次插入时更新答案即可 颜色数要离 ...

  8. loj516 DP一般看规律(set启发式合并)

    题目: https://loj.ac/problem/516 分析: 每次将一个颜色更改为另一个颜色相当于将两个集合合并 然后对于答案的更新,一个点插入到一个集合中,那么可能更新答案的就是其前驱节点或 ...

  9. HDU 4588 Count The Carries 数位DP || 打表找规律

    2013年南京邀请赛的铜牌题...做的非常是伤心.另外有两个不太好想到的地方.. ..a 能够等于零,另外a到b的累加和比較大.大约在2^70左右. 首先说一下解题思路. 首先统计出每一位的1的个数, ...

随机推荐

  1. IPReversePathFilter

    nstat TcpExtIPReversePathFilter for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do > echo 0 > $ ...

  2. 关于JS里面写JAVA代码的问题

    最近做项目需要在JS脚本里面调用一个JAVA的函数得到数据,在网上查了很久,发现JS脚本里面不能写JAVA函数.只能把JS脚本里面的代码写进JSP文件里面的<script>标签内,然后写J ...

  3. Linux less命令语法

    一.Linux less命令语法 less [参数] 文件 less命令非常强大,在此只介绍几个常用的参数,更多参数使用man less来查看Linux帮助手册. -b <缓冲区大小> 设 ...

  4. C# 饼形图

    原文链接:https://www.cnblogs.com/icyJ/archive/2012/10/08/Chart_Pie.html 需要实现的目标是: 1.将数据绑定到pie的后台数据中,自动生成 ...

  5. SFTPHelper

    public class SFTPHelper { #region 字段或属性 private readonly SftpClient _sftp; /// <summary> /// S ...

  6. BZOJ 1196 公路修建问题(二分+最小生成树)

    题目要求求出图中的一颗生成树,使得最大的边权最小,且满足一级公路的个数>=k. 考虑二分最大边,问题就变为给出的图的生成树中,是否满足所有的边<=val,且一级公路的个数>=k. 所 ...

  7. jzoj3865[JSOI2014]士兵部署

    ‘ 数据范围:n,m<=10^5,传送门:https://jzoj.net/senior/#main/show/3865 感觉jzoj好高明啊,就是访问不太稳定. 首先题意中被n个点控制的区域相 ...

  8. Go语言【第十四篇】:Go语言基础总结

    Go语言类型转换 类型转换用于将一种数据类型的变量转换为另外一种类型的变量,Go语言类型转换基本格式如下: type_name(expression) type_name为类型,expression为 ...

  9. Android 4.0源码结构

    Android 4.0 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- build (存放系统编译规则及generic等 ...

  10. Spring源码解析-autowiring自动装配的实现

    IoC容器提供了自动依赖装配的方式,为应用IoC容器提供很大的方便.在自动配置中,不需要显式的去指定Bean属性,只需要配置autowiring属性,IoC容器会根据这个属性配置,使用反射的方式查找属 ...