POJ 2836 Rectangular Covering 状态压缩DP(铺砖问题)

news2024/11/30 2:26:58

一、题目大意

坐标系中有n个点,它们满足 -1000<=x<=1000,-1000<=y<=1000。

现在要在坐标系中放一些矩形,要使得每个点都被矩形覆盖(被矩形的边或者顶点覆盖也可以),每个矩形都必须满足面积大于0,且每个矩形最少要覆盖两个点。

请你输出覆盖所有点时,如何使所有矩形的面积和最小,输出这个面积和。

二、解题思路

我们可以从左上角的点开始,一点点的覆盖到右下角的点。

那么对于第 i 个点,我们可以认为

1、i 以前的点都被覆盖;

2、如果 i 还未被覆盖,则它必须被覆盖。

同时思考下,当铺设到第 i 个点时,对于覆盖情况固定时,铺完剩下的点需要的最小矩形面积是固定的。

则可以定义DP数组,DP[S][i]代表已经铺设的点的集合为S时,铺设好第 i 个点到最后一个点所需要的最小的矩形面积。

对于最后一个点n-1,如果S包含n-1,则DP[S][n-1]=0,如果不包含,那么DP[S][n-1]=点n-1到其余点的矩形的面积的最小值。

那么借助这个思路,我们就可以展开循环,外层放 i ,从 n - 1 到 0循环,内层放 S,从 1 到 (1<<n)-1循环,当S包含 i 时,则DP[S][i]=DP[S][i+1]。

如果S不包含 i ,就循环其他所有点 j (i != j),

DP[S][i]=min(DP[S][i],DP[S 添加 i 添加 j][i+1]+i和j组成的矩形面积)

思路可以了,但欠缺一点,有时候一个矩形会覆盖两个点。

这种情况仅在两个点同行或同列的情况出现,否则是下图

那么加个判断,如果两个点是同一条直线,它们之间的矩形为零的那条边设置长度为1。同时连一条边的时候,判断是否有其他点是否也在矩形内的,记录它们到集合child里,更改递推式为

DP[S][i]=min(DP[S][i],DP[S 添加 i 添加 j 添加child内所有的元素][i+1]+i和j组成的矩形面积)

(这里只判断 i 之后的点是否在范围内即可,因为之前的不会影响到DP[XXX][i+1]之后的值)

循环集合时,要跳过确定已经连了的部分来提速。

三、代码

#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
struct P
{
    int x, y;
    P(int x = 0, int y = 0) : x(x), y(y) {}
};
bool compare(P &a, P &b)
{
    return a.y != b.y ? a.y > b.y : a.x < b.x;
}
const int MAX_N = 15;
const int INF = 0x3f3f3f3f;
int dp[2][1 << MAX_N];
P dat[15];
int n;
int *crt = dp[0], *nxt = dp[1];
void solveItem(int i, int used)
{
    if (used >> i & 1)
    {
        nxt[used] = crt[used];
        return;
    }
    nxt[used] = INF;
    for (int j = 0; j < n; j++)
    {
        if (i == j)
        {
            continue;
        }
        int w = abs(dat[i].x - dat[j].x);
        int h = abs(dat[i].y - dat[j].y);
        int x1 = min(dat[i].x, dat[j].x);
        int y1 = min(dat[i].y, dat[j].y);
        int area = (w > 0 ? w : 1) * (h > 0 ? h : 1);
        int child = 0;
        for (int k = i + 1; k < n; k++)
        {
            if ((dat[k].x >= x1 && dat[k].x <= (x1 + w) && dat[k].y >= y1 && dat[k].y <= (y1 + h)) ||
                (w == 0 && dat[k].x >= (x1 - 1) && dat[k].x <= x1 && dat[k].y >= y1 && dat[k].y <= (y1 + h)) ||
                (h == 0 && dat[k].y >= (y1 - 1) && dat[k].y <= y1 && dat[k].x >= x1 && dat[k].x <= (x1 + w)))
            {
                child = child | (1 << k);
            }
        }
        nxt[used] = min(nxt[used], crt[used | (1 << i) | (1 << j) | child] + area);
    }
}
void solve()
{
    memset(dp, 0, sizeof(dp));
    int all = (1 << n) - 1;
    for (int i = n - 1; i >= 0; i--)
    {
        all = all & ~(1 << i);
        for (int S = 0; S < (1 << (n - i)); S++)
        {
            int used = all | (S << i);
            solveItem(i, used);
        }
        swap(crt, nxt);
    }
    printf("%d\n", crt[0]);
}
int main()
{
    while (true)
    {
        scanf("%d", &n);
        if (n == 0)
        {
            break;
        }
        for (int i = 0; i < n; i++)
        {
            scanf("%d%d", &dat[i].x, &dat[i].y);
        }
        sort(dat, dat + n, compare);
        solve();
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1215679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新AI创作系统ChatGPT系统运营源码/支持最新GPT-4-Turbo模型/支持DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

推荐一个非常好用的uniapp的组件库【TMUI3.0】

文章目录 前言官网地址如何使用&#xff1f;注意事项后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端系列文章 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果…

flutter 绘制右上角圆角三角形标签

绘制&#xff1a; import package:jade/utils/JadeColors.dart; import package:flutter/material.dart; import dart:math as math;class LabelTopRightYellow extends StatefulWidget {final String labelTitle; // 只能两个字的&#xff08;文字偏移量没有根据文字长度改变…

你不懂API接口是什么?怎么和程序员做朋友

说到开发平台就一定离不开接口&#xff0c;作为PM&#xff0c;我们不需要对接口了解的特别细。只需要知道接口是什么&#xff0c;有什么用&#xff0c;有哪些要素就行。 1. 接口是什么 (1) 硬件接口 生活中我们经常会接触接口&#xff0c;最常见的就是HDMI接口和USB接口&…

到什么程度才叫精通 Linux?

到什么程度才叫精通 Linux&#xff1f; 一般说自己精通某项技术的&#xff0c;要么是应届生&#xff0c;要么是刚工作没多久的&#xff0c;再者就是半桶水的人。 Linux 博大精深&#xff0c;我敢肯定&#xff0c;Linus 本人都不敢说自己精通 Linux 。最近很多小伙伴找我&#…

【Linux】文件系统中inode与软硬链接以及读写权限问题

文章目录 前言一、 简单理解文件系统二、文件操作具体步骤1.新建文件2.删除文件3.查找文件 三、目录的重新理解1.目录下没有w权限&#xff0c;无法对其下的文件进行创建与删除2.目录下没有r权限&#xff0c;无法对其下的文件进行查看3.目录下没有x权限&#xff0c;无法进入这个…

基于Optuna的transformers模型自动调参

文章目录 一、导入相关包二、加载数据集三、划分数据集四、数据集预处理五、创建模型&#xff08;区别一&#xff09;六、创建评估函数七、创建 TrainingArguments(区别二)八、创建 Trainer(区别三)九、模型训练十、模型训练(自动搜索)(区别四)启动 tensorboard 以文本分类为例…

使用 Redis 构建轻量的向量数据库应用:图片搜索引擎(一)

本篇文章聊聊更轻量的向量数据库方案&#xff1a;Redis。 以及基于 Redis 来快速实现一个高性能的本地图片搜索引擎&#xff0c;在本地环境中&#xff0c;使用最慢的稠密向量检索方式来在一张万图片中查找你想要的图片&#xff0c;总花费时间都不到十分之一秒。 写在前面 接着…

C++进阶-STL 常用算法列举

STL 常用算法列举 概述常用遍历算法for_each 遍历容器transfrom 搬运容器到另一个容器中 常用查找函数find 查找元素find_if 按条件查找元素adjacent_find 查找相邻重复元素binary_search 二分查找法count 统计元素个数count_if 按条件统计元素个数 常用排序算法sort 对元素内内…

Linux C/C++全栈开发知识图谱(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)

众所周知&#xff0c;在所有的编程语言中&#xff0c;C语言是一门颇具学习难度&#xff0c;需要很长学习周期的编程语言。甚至很多人经常听到一句调侃的话语——“C&#xff0c;从入门到放弃”。 C界的知名书籍特别多&#xff0c;从简单到高端书籍&#xff0c;许多书籍都是C之…

8086与8088

一、8086与8088概述 8088/8086都是16位微处理器&#xff0c;内部运算器和寄存器都是16位的&#xff0c;同样具有20位地址线8088/8086都是由执行单元(EU)和总线接口部件(BIU)两大部分构成指令系统和寻址能力都相同&#xff0c;两种CPU是兼容的8088被称作准十六位的、是紧继8086…

为什么红帽Linux值得学习?红帽Linux是什么

为什么红帽Linux值得学习 物联网、云计算、大数据&#xff0c;或许你都耳熟能详&#xff0c;但是Linux可能你却感觉到有点陌生。这些未来趋势的行业使用的嵌入式、c、JAVA、PHP等底层应用软件都是在Linux操作系统上Linux运维工程师作为移动互联网的关键支撑岗位&#xff0c;缺口…

Redis内存淘汰机制

Redis内存淘汰机制 引言 Redis 启动会加载一个配置&#xff1a; maxmemory <byte> //内存上限 默认值为 0 (window版的限制为100M)&#xff0c;表示默认设置Redis内存上限。但是真实开发还是需要提前评估key的体量&#xff0c;提前设置好内容上限。 此时思考一个问题…

避坑指南!!在树莓派4b上安装Pycharm以及无法使用终端的问题解决!!

一、下载Pycharm–linux安装包 这里是踩的第一个坑&#xff0c;一开始我下载的是pycharm2023-linux版本的。后面发现缺少很多东西&#xff0c;安装不成功。后面下载了低版本的Pycharm才可以。我下载的是2020版本的。注意&#xff1a;在下载安装包时&#xff0c;一定要在window…

小米手机获取电池健康度

目录 方法一&#xff1a;使用Bug反馈功能 1. 打开拨号界面&#xff0c;输入*#*#284#*#* 2. 导出结果&#xff0c;等待即可 3. 找到这个压缩文件 4. 解压缩【我这里直接拷贝到电脑中操作&#xff0c;手机同理】 4.1 解压&#xff1a; 4.2 将得到的新的压缩文档解压 5. 打…

Stages—研发过程可视化建模和管理平台

产品概述 Stages是美国UL Solutions旗下UL Method Park GmbH的产品&#xff0c;用于帮助企业定义、管理、发布、控制、优化其研发过程&#xff0c;同时使其研发过程符合CMMI、ASPICE、ISO26262等标准。Stages的核心理念是把过程理论和实际项目进行有机结合。Stages聚焦于研发过…

web环境实现一键式安装启动

部署的痛点 一般在客户环境安装web环境&#xff0c;少说需要花费1-2小时。一般需要安装jdk、nginx、mysql、redis等 等你接触到了inno setup &#xff0c;你有可能会节约更少的时间去部署。也有可能是一个不懂技术的人&#xff0c;都可以进行操作的。废话不多说&#xff0c;接…

JS原生-弹框+阿里巴巴矢量图

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

LeetCode - 160. 相交链表(C语言,配图)

思路&#xff1a; 1. 我们算出两个链表的长度lenA&#xff0c;lenB。我们在这里最后判断一下&#xff0c;两个链表的尾节点是否是一样的&#xff0c;如果是相交链表&#xff0c;那它们的尾节点一定是一样的。 2. 算出长链表和短链表的差距n&#xff08;n | lenA- lenB |&#…

【分享课】11月16日晚19:30PostgreSQL分享课:PG缓存管理器主题

PostsreSQL分享课分享主题: PG缓存管理器主题 直播分享平台&#xff1a;云贝教育视频号 时间&#xff1a;11月16日 周四晚 19: 30 分享内容: 缓冲区管理器结构 缓冲区管理器的工作原理 环形缓冲区 脏页的刷新