[NOIP2002]矩形覆盖
2012-08-13 09:56
211 查看
在平面上有 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。各个矩形必须完全分开(边线与顶点也都不能重合)。
xl y1
x2 y2
... ...
xn yn (0<=xi,yi<=500)
第一次作到该种DP题,思维很新颖。
将点按x为第一关键字,y为第二关键字,递增排序。
f[i][j][k]表示 由点 i 到点 j范围之内分成 k 个矩形最少面积。
这些点可以用 k 个矩形(1<=k<=4)全部覆盖,矩形的边平行于坐标轴。当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4。问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢。约定:覆盖一个点的矩形面积为 0;覆盖平行于坐标轴直线上点的矩形面积也为0。各个矩形必须完全分开(边线与顶点也都不能重合)。
输入格式
n kxl y1
x2 y2
... ...
xn yn (0<=xi,yi<=500)
输出格式
一个整数,即满足条件的最小的矩形面积之和。第一次作到该种DP题,思维很新颖。
将点按x为第一关键字,y为第二关键字,递增排序。
f[i][j][k]表示 由点 i 到点 j范围之内分成 k 个矩形最少面积。
#include<iostream> #define Max 1000000 using namespace std; int n,m,ans=Max,x[52],y[52],f[52][52][5]={0}; int High(int i,int j){ int maxh=0,minh=1000,temp=i; while(temp<=j) maxh=max(maxh,y[temp++]); temp=i; while(temp<=j) minh=min(minh,y[temp++]); return maxh-minh; } void Dp(){ for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) for(int k=2;k<=m;++k) f[i][j][k]=Max; for(int i=1;i<=n;++i) for(int j=i+1;j<=n;++j) f[i][j][1]=(x[j]-x[i])*High(i,j); for(int i=1;i<=n;++i) for(int k=1;k<=m;++k) f[i][i][k]=0; for(int k=2;k<=m;++k) for(int i=1;i<=n;++i) for(int j=i+1;j<=n;++j) for(int l=i+1;l<=j;++l) f[i][j][k]=min(f[i][j][k],f[i][l-1][k-1]+(x[j]-x[l])*High(l,j)); ans=min(ans,f[1] [m]); } int main() { cin>>n>>m; for(int i=1;i<=n;++i) cin>>x[i]>>y[i]; for(int i=1;i<=n;++i) for(int j=i+1;j<=n;++j) if(x[i]>x[j]) {swap(x[i],x[j]);swap(y[i],y[j]);} else if(x[i]==x[j]&&y[i]>=y[j]) swap(y[i],y[j]); Dp(); for(int i=1;i<=n;++i) swap(x[i],y[i]); for(int i=1;i<=n;++i) for(int j=i+1;j<=n;++j) if(x[i]>x[j]) {swap(x[i],x[j]);swap(y[i],y[j]);} else if(x[i]==x[j]&&y[i]>=y[j]) swap(y[i],y[j]); Dp(); cout<<ans<<endl; return 0; }
相关文章推荐
- 【CodeVS1101】【NOIP2002】矩形覆盖
- [NOIP2002] 提高组 洛谷P1034 矩形覆盖
- noip2002 矩形覆盖 (区间动归,深搜)
- 【NOIP2002】矩形覆盖 DFS
- NOIP 2002 矩形覆盖
- NOIP 2002 矩形覆盖 解题报告
- [Wikioi 1101][NOIP 2002提高组]矩形覆盖
- noip2002 矩形覆盖
- 【NOIP2002提高组T4】矩形覆盖-DFS剪枝
- NOIP2002 矩形覆盖
- COGS103&tyvj1899 [NOIP2002]矩形覆盖
- NOIP 2002 矩形覆盖
- |洛谷|搜索|NOIP2002|P1034 矩形覆盖
- NOIP2002矩形覆盖[几何DFS]
- NOIP2002 矩形覆盖
- 洛谷 P1034 [NOIP2002 T4] 矩形覆盖
- 【NOIP2002】矩形覆盖 DFS
- noip2002矩阵覆盖(搜索)
- 《剑指offer》-矩形覆盖
- 剑指offer-题目1390:矩形覆盖 (2014.1.5)