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. liunx 安装rsync

    新建一个rsync.s文件,把下面的代码写入文件里: #!/usr/bin/env bash mkdir -p /data/app/rsync/etc/ mkdir -p /data/logs/rsy ...

  2. golang强制类型转换

    github.com/Unknwon/com包的使用 package main import ( "fmt" "github.com/Unknwon/com" ...

  3. 从入门到自闭之Python函数初识

    函数初识 定义:def--关键字 ​ 将某个功能封装到一个空间中就是一个函数 功能: ​ 减少重复代码 函数的调用 ​ 函数名+():调用函数和接收返回值 函数的返回值 return 值 == 返回值 ...

  4. js创建jsonArray传输至后台及后台解析

    //产品清单 //产品数量长度 var cnbvLength = FieldCount9 + 1; var arrayList=[]; for(var i = 0; i < cnbvLength ...

  5. Collection接口的子接口——Deque接口

    https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html public interface Deque<E> exten ...

  6. mongoDB数据库文件路径和数据操作

    1.查看MongoDB在电脑上的安装路径 which mongod 2.默认mongodb 数据文件是放到根目录 data/db 文件夹下,如果没有这个文件,需要自行创建 mkdir -p /data ...

  7. springboot2整合zookeeper集成curator

    步骤: 1- pom.xml <dependency> <groupId>org.apache.curator</groupId> <artifactId&g ...

  8. JS基础_标识符

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. Get MySQL这5个优化技巧

    一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇文章主要谈谈MySQL数据库在发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大 ...

  10. 07 Python之协程

    协程: 协程是一种用户态的轻量级线程, 即协程是由用户程序自己控制调度的 1.Greenlet import time # import greenlet from greenlet import g ...