题目里给的范围是k<=4,但是官方数据并没有k==4的情况,导致一些奇奇怪怪的DP写法也能过。听说标程在k==4的时候有反例,掀桌….. 难怪COGS上k==4的数据答案是错的。

还是好好写个搜索吧:网上写法很多.我是每次沿着一条平行于坐标轴的直线将点集分割成两部分,并枚举k个矩形如何在两边分配。边界为k==1,扫一遍所有点找到最小的矩形。细节看代码吧.

但是这个搜索我也不能保证是对的,因为k==4有可能出现这种崎岖的最优方案:不存在一条平行于坐标轴且不和任何一个矩形相交的直线将4个矩形分成两部分.例如这样的最优方案:

贴个代码吧:递归的时候为了处理“将点集分成两部分”调了一堆memcpy….好在递归层数和点数都不多,不然常数炸天....

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
int x[maxn],y[maxn],seq[maxn];
inline int max(int a,int b){
return a>b?a:b;
}
inline int min(int a,int b){
return a<b?a:b;
}
bool cmp1(const int &a,const int &b){
return x[a]<x[b];
}
bool cmp2(const int &a,const int &b){
return y[a]<y[b];
}
struct node{
int x1,y1,x2,y2;
node(){}
node(int a,int b,int c,int d){
x1=a;y1=b;x2=c;y2=d;
}
}sol[];int cnt=;
int work(int l,int r,int seq[]){
int minx=0x7f7f7f7f,miny=0x7f7f7f7f,maxx=,maxy=;
for(int i=l;i<=r;++i){//printf("seq%d\n",seq[i]);
minx=min(minx,x[seq[i]]);maxx=max(maxx,x[seq[i]]);
miny=min(miny,y[seq[i]]);maxy=max(maxy,y[seq[i]]);
}
sol[++cnt]=node(minx,miny,maxx,maxy);
return (maxx-minx)*(maxy-miny);
}
int s[][];int tot=;
int dfs(int l,int r,int k,int seq[]){//printf("%d\n",k);
if(k==){
int tmp=work(l,r,seq);
cnt--;
return tmp;
}else{
int ans=0x7f7f7f7f;
sort(seq+l,seq+r+,cmp1);
for(int i=l;i<r;++i){
for(int j=;j<k;++j){
++tot;
memcpy(s[tot],seq,sizeof(int)*);
++tot;
memcpy(s[tot],seq,sizeof(int)*);
if(x[seq[i]]!=x[seq[i+]]){
int tmp=dfs(l,i,j,s[tot-])+dfs(i+,r,k-j,s[tot]);
ans=min(ans,tmp);
}
--tot;--tot;
//printf("---------------\n");
}
}//printf("%d\n",ans);
sort(seq+l,seq+r+,cmp2);
for(int i=l;i<r;++i){
for(int j=;j<k;++j){
++tot;
memcpy(s[tot],seq,sizeof(int)*);
++tot;
memcpy(s[tot],seq,sizeof(int)*);
if(y[seq[i]]!=y[seq[i+]]){
int tmp=dfs(l,i,j,s[tot-])+dfs(i+,r,k-j,s[tot]);
ans=min(ans,tmp);
}
--tot;--tot;
//printf("---------------\n");
}
}//printf("%d\n",ans);
return ans;
}
}
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i=;i<=n;++i){
scanf("%d%d",x+i,y+i);
}
for(int i=;i<=n;++i){
seq[i]=i;
}
printf("%d\n",dfs(,n,k,seq));
return ;
}

COGS103&tyvj1899 [NOIP2002]矩形覆盖的更多相关文章

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

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

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

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

  3. NOIP2002 矩形覆盖

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

  4. 洛谷1034 NOIP2002 矩形覆盖

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

  5. 【OpenJudge 1793】矩形覆盖

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

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

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

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

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

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

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

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

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

随机推荐

  1. Windows 8.1 新增控件之 Flyout

    本篇为大家介绍Flyout 控件,Flyout 属于一种轻量级交互控件,可以支持信息提示或用户交互.与传统Dialog 控件不同的是Flyout 控件可通过直接点击对话框外部区域忽略. Flyout ...

  2. C语言复习(1)

    test.c #include <stdio.h> int main(){ printf("hello\n"); return 0; } 1.预处理阶段 由于在test ...

  3. CSS基本知识0-命名规范

    CSS命名及规范是第一步: 总起:所有名字小写,样式名用-号连接,如.nav-left,CSS使用小写加连接,那么ID就使用大写不加连接,比如UserName,把它和编程的属性对应起来,那么方法就以小 ...

  4. 自己存档:ajax 动态提交form

    $.ajax({                    cache: true,                    type: "POST",                  ...

  5. j-link或者swd调试

    两种 一.JTAG调试(5针), 二.SWD调试(2针), 在JTAG/SWD模式设置库函数 (在文件stm32f10x_gpio.c中): void GPIO_PinRemapConfig(uint ...

  6. javascript代码片段

    DOMReady函数,只要DOM结构加载完成即可,不必等待所有资源加载完成,节约时间,"DOMContentLoaded"在H5中被标准化 var DOMReady=functio ...

  7. STL中algorithm里的查找

    首先,选择查找算法时,区间是否排序是一个至关重要的因素.可以按是否需要排序区间分为两组: A. count,find B. binary_search,lower_bound,upper_bound, ...

  8. linux基础-第十一单元 系统监控

    第十一单元 系统监控 系统监视和进程控制工具-top和free top命令的功能 TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序 ...

  9. java-io-FileInputStream与FileOutputStream类

    本文转载这里FileInputStream和FileOutputStream类需要注意的问题:  1.FileInputStream和FileOutputStream类分别用来创建磁盘文件的输入流和输 ...

  10. mysql-case ... when...then...else...end处理判断赋值机制

    then jrkp else zrspj end ))/(case zrspj then jrkp else zrspj end ) zdf from hqxg order by zdf LIMIT ...