P1034 矩形覆盖

题目描述

在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示。例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一。

这些点可以用 k 个矩形(1<=k<=4)全部覆盖,矩形的边平行于坐标轴。当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4。问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢。约定:覆盖一个点的矩形面积为 0;覆盖平行于坐标轴直线上点的矩形面积也为0。各个矩形必须完全分开(边线与顶点也都不能重合)。

输入输出格式

输入格式:

n k xl y1 x2 y2 ... ...

xn yn (0<=xi,yi<=500)

输出格式:

输出至屏幕。格式为:

一个整数,即满足条件的最小的矩形面积之和。

输入输出样例

输入样例#1:

4 2
1 1
2 2
3 6
0 7
输出样例#1:

4

思路:

  dp

坑点:

  原来这题k<=3(据说这题数据很水~)

上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int M = ;
int n,k,l,r;
int dp[M][M][]; struct D{
int x,y;
bool operator < (const D &qwq) const
{///按y大小进行排序
if(y!=qwq.y) return y < qwq.y;
return x < qwq.x;
}
}point[M]; int main()
{
//freopen("jxfg.in","r",stdin);
//freopen("jxfg.out","w",stdout);
memset(dp,0x3f,sizeof(dp));
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d%d",&point[i].x,&point[i].y);
sort(point+,point++n);
for(int i=;i<=n;i++)
{
l=r=point[i].x;
for(int j=i+;j<=n;j++)
{
l=min(l,point[j].x);
r=max(r,point[j].x);
dp[i][j][]=min(dp[i][j][],(point[j].y-point[i].y)*(r-l));
}
}
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int s=i+;s<j;s++)///mid
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int s=i+;s<j;s++)
dp[i][j][]=min(dp[i][j][],min((dp[i][s][]+dp[s+][j][]),(dp[i][s][]+dp[s+][j][])));
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int s=i+;s<j;s++)
{
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
}
printf("%d",dp[][n][k]);
return ;
}

 你以为这样就完了吗???

!!!

我们在cogs上提交发现:

!!!WA2点!!!

坑点:

  其实这里所讲的是暴力做法(WA纯属正常嘻嘻)

代码:(乱写加上了个特判的还是WA一个点的代码)

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int M = ;
int n,k,l,r;
int dp[M][M][]; struct D{
int x,y;
bool operator < (const D &qwq) const
{///按y大小进行排序
if(y!=qwq.y) return y < qwq.y;
return x < qwq.x;
}
}point[M]; int main()
{
freopen("jxfg.in","r",stdin);
freopen("jxfg.out","w",stdout);
memset(dp,0x3f,sizeof(dp));
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d%d",&point[i].x,&point[i].y);
sort(point+,point++n);
for(int i=;i<=n;i++)
{
l=r=point[i].x;
for(int j=i+;j<=n;j++)
{
l=min(l,point[j].x);
r=max(r,point[j].x);
dp[i][j][]=(point[j].y-point[i].y)*(r-l);
}
}
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int s=i+;s<j;s++)///mid
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int s=i+;s<=n;s++)
dp[i][j][]=min(dp[i][j][],min((dp[i][s][]+dp[s+][j][]),(dp[i][s][]+dp[s+][j][])));
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
for(int s=i+;s<=n;s++)
{
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
dp[i][j][]=min(dp[i][j][],dp[i][s][]+dp[s+][j][]);
}
if(dp[][n][k]==)
dp[][n][k]-=;
printf("%d",dp[][n][k]);
return ;
}

luoguP1034 矩形覆盖 x的更多相关文章

  1. [LuoguP1034][Noip2002] 矩形覆盖

    [LuoguP1034][Noip2002] 矩形覆盖(Link) 在平面上有\(N\)个点,\(N\)不超过五十, 要求将这\(N\)个点用\(K\)个矩形覆盖,\(k\)不超过\(4\),要求最小 ...

  2. 【OpenJudge 1793】矩形覆盖

    http://noi.openjudge.cn/ch0405/1793/ 好虐的一道题啊. 看数据范围,一眼状压,然后调了好长时间QwQ 很容易想到覆盖的点数作为状态,我用状态i表示至少覆盖状态i表示 ...

  3. NOIP2002矩形覆盖[几何DFS]

    题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...

  4. bzoj 1185 旋转卡壳 最小矩形覆盖

    题目大意 就是求一个最小矩形覆盖,逆时针输出其上面的点 这里可以看出,那个最小的矩形覆盖必然有一条边经过其中凸包上的两个点,另外三条边必然至少经过其中一个点,而这样的每一个点逆时针走一遍都满足单调性 ...

  5. [剑指OFFER] 斐波那契数列- 跳台阶 变态跳台阶 矩形覆盖

    跳台阶 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloor(int number) ...

  6. NOIP2002 矩形覆盖

    题四 矩形覆盖(存盘名NOIPG4) [问题描述]: 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2), ...

  7. UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]

    题意: 求矩形覆盖K次以上的面积 分析: k很小,可以开K颗线段树,用sum[rt][i]来保存覆盖i次的区间和,K次以上全算K次 // File Name: 11983.cpp // Author: ...

  8. 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1945  Solve ...

  9. BZOJ:1185: [HNOI2007]最小矩形覆盖

    1185: [HNOI2007]最小矩形覆盖 这计算几何……果然很烦…… 发现自己不会旋转卡壳,补了下,然后发现求凸包也不会…… 凸包:找一个最左下的点,其他点按照与它连边的夹角排序,然后维护一个栈用 ...

随机推荐

  1. Spring(十二)--Spring AspectJ

    Spring AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. As ...

  2. (一)Java秒杀项目之项目环境搭建

    一.Spring Boot环境搭建 1.把项目分成多个模块,每个模块对应一部分(不一定是一个章节)的内容,代码将在文章的具体位置给出,每个模块都是在之前模块的基础上构建,每个模块都为Spring Bo ...

  3. 比反射更快!使用ASM获取class信息(ClassReader)

    比反射更快!使用ASM获取class信息(ClassReader) 通常我们想要在java运行时获取class的信息时,通常使用反射的方式来获取其中的属性,方法,注解等信息.通常是这样的: Class ...

  4. # N数码问题

    N数码问题 首先,先贯彻一个理念.奇偶性很神奇,对于一类问题,如果属于同种性质(奇偶性相同),那么它们就是完全相同(这个在某种意义上说)的,,一些问题如果奇偶性相同那么里面涉及的问题都是等价的. 数码 ...

  5. 如何让 node 运行 es6 模块文件,及其原理

    如何让 node 运行 es6 模块文件,及其原理 最新版的 node 支持最新版 ECMAScript 几乎所有特性,但有一个特性却一直到现在都还没有支持,那就是从 ES2015 开始定义的模块化机 ...

  6. Python应用RabbitMQ教程

    介绍 RabbitMQ是一个消息代理.它的工作就是接收和转发消息.你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处.在这个比喻中,RabbitMQ就扮演着邮箱.邮局以及邮 ...

  7. 图片哈希概论及python中如何实现对比两张相似的图片

    Google 以图搜图的原理,其中的获取图片 hash 值的方法就是 AHash. 每张图片都可以通过某种算法得到一个 hash 值,称为图片指纹,两张指纹相近的图片可以认为是相似图片. 以图搜图的原 ...

  8. CentOS下安装DockerCE

    title: CentOS下安装DockerCE comments: false date: 2019-09-04 09:47:58 description: 在CentOS下安装社区版Docker ...

  9. lxml:底层C语言实现、高效地处理html

    介绍 lxml也是一个用于筛选指定html内容的模块,pyquery就是基于lxml. 使用lxml主要需要了解xpath xpath语法 /:在子节点里面找 //:在子子孙孙节点里面找 //div: ...

  10. 2019.10.28sql注入工具

    SQLMAP工具的使用 sql注入工具:明小子 啊D 萝卜头 穿山甲 sqlmap等等 开源自动化注入利用工具,支持12中数据库,在/plugins中可以看到支持的数据库种类 支持的注入类型:bool ...