[NOIP2002]矩形覆盖
在平面上有 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)
输出格式
一个整数,即满足条件的最小的矩形面积之和。
第一次作到该种DP题,思维很新颖。
将点按x为第一关键字,y为第二关键字,递增排序。
f[i][j][k]表示 由点 i 到点 j范围之内分成 k 个矩形最少面积。
1 #include<iostream> 2 #define Max 1000000 3 using namespace std; 4 5 int n,m,ans=Max,x[52],y[52],f[52][52][5]={0}; 6 7 int High(int i,int j){ 8 int maxh=0,minh=1000,temp=i; 9 while(temp<=j) 10 maxh=max(maxh,y[temp++]); 11 temp=i; 12 while(temp<=j) 13 minh=min(minh,y[temp++]); 14 return maxh-minh; 15 } 16 17 18 void Dp(){ 19 for(int i=1;i<=n;++i) 20 for(int j=1;j<=n;++j) 21 for(int k=2;k<=m;++k) 22 f[i][j][k]=Max; 23 24 for(int i=1;i<=n;++i) 25 for(int j=i+1;j<=n;++j) 26 f[i][j][1]=(x[j]-x[i])*High(i,j); 27 for(int i=1;i<=n;++i) 28 for(int k=1;k<=m;++k) 29 f[i][i][k]=0; 30 31 for(int k=2;k<=m;++k) 32 for(int i=1;i<=n;++i) 33 for(int j=i+1;j<=n;++j) 34 for(int l=i+1;l<=j;++l) 35 f[i][j][k]=min(f[i][j][k],f[i][l-1][k-1]+(x[j]-x[l])*High(l,j)); 36 37 ans=min(ans,f[1][n][m]); 38 } 39 40 int main() 41 { 42 cin>>n>>m; 43 for(int i=1;i<=n;++i) 44 cin>>x[i]>>y[i]; 45 46 for(int i=1;i<=n;++i) 47 for(int j=i+1;j<=n;++j) 48 if(x[i]>x[j]) {swap(x[i],x[j]);swap(y[i],y[j]);} 49 else if(x[i]==x[j]&&y[i]>=y[j]) swap(y[i],y[j]); 50 51 Dp(); 52 53 for(int i=1;i<=n;++i) 54 swap(x[i],y[i]); 55 56 for(int i=1;i<=n;++i) 57 for(int j=i+1;j<=n;++j) 58 if(x[i]>x[j]) {swap(x[i],x[j]);swap(y[i],y[j]);} 59 else if(x[i]==x[j]&&y[i]>=y[j]) swap(y[i],y[j]); 60 61 Dp(); 62 63 cout<<ans<<endl; 64 return 0; 65 66 }
转载于:https://www.cnblogs.com/noip/archive/2012/08/13/2635815.html
[NOIP2002]矩形覆盖相关推荐
- 递归和循环:跳台阶和变态跳台阶和矩形覆盖
题目描述 跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 变态跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级--它 ...
- 剑指offer_第10题_矩形覆盖
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形. 请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 理解 n个2*1的小矩形 覆盖 2*n的大矩形 覆盖方式: ...
- 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------剑指offer系列
题目:斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). f(n) = f(n-1) + f(n-2) 基本思路 这道题在剑指offe ...
- BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 1435 Solv ...
- hdu5251最小矩形覆盖
题意(中问题直接粘吧) 矩形面积 Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些矩形包围起来的面积最小的矩形的面积是多少. Input 第 ...
- 洛谷 P1034 矩形覆盖
P1034 矩形覆盖 题目描述 在平面上有nn个点(n \le 50n≤50),每个点用一对整数坐标表示.例如:当 n=4n=4 时,44个点的坐标分另为:p_1p1(1,11,1),p_2p2( ...
- 剑指Offer #10 矩形覆盖(问题分析)
题目来源:牛客网-剑指Offer专题 题目地址:矩形覆盖 题目描述 我们可以用2∗12*12∗1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2∗12*12∗1的小矩形无重叠地覆盖一个2∗n2*n2 ...
- 算法练习day20——190411(重建二叉树、斐波那契数列、跳台阶、矩形覆盖、变态跳台阶、旋转数组的最小数字、矩阵中的路径)
1.重建二叉树 根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. preorder = [3,9,20,15,7].inorder = [9 ...
- 求点被多少个矩形覆盖
有很多矩形,矩形可能会重叠,又有很多点分散在平面上,求每一个点被多少个矩形覆盖? 方法1: 参考:http://dongxicheng.org/structure/segment-tree/ 总体思想 ...
最新文章
- oracle数据库 gbk,oracle 数据库编码转换(转GBK) | 学步园
- [转] JavaScript:彻底理解同步、异步和事件循环(Event Loop)
- rman实验——测试备份压缩
- 给php权限,PHP实现权限管理功能的方法
- postgis数据库优化_PostgreSQL批量导入性能优化
- 神奇的python(二)之python打包成应用程序
- wr885n虚拟服务器设置,动态IP设置:选择动态IP(以太网宽带
- 启动tomcat时遇到的问题
- oracle上如何下载java_王二暖Oracle视频教程 下载
- maven系列:生命周期
- 【题解】10-19秀秀的森林(forest)
- 手机USSD网络命令编辑器
- python pandas 在现有excel中插入新数据
- 二、了解shiro架构 (10 Minute Tutorial on Apache Shiro)
- 上市公司注册城市、上市日期、成立日期以及行业和注册资本信息
- 企业管理信息系统 Django-ERP
- 怎么会这样!超声刀两年后面部塌陷,超声刀失败可以补救吗,让人头大!不要啊
- 第七章第三十六题(游戏:八皇后问题)(Game: Eight Queens)
- 神经网络——实现MNIST数据集的手写数字识别
- 身份证校验(//身份证号合法性验证 //支持15位和18位身份证号//支持地址编码、出生日期、校验位验证)
热门文章
- Flutter 日期选择器与时间选择器
- java基础—IO流——字节流的操作演示
- kingbase7获取唯一索引和子分区键的view
- my footprint :走过的路
- python基础-python函数参数为print语句时的输出
- ThreadLocal 简介 案例 源码分析 MD
- javaweb servlet
- js添加广告模块,随页面移动而移动
- Excel 导入 Sql Server出错——“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决...
- vim打开出现的文档^M什么