Looking for Order (状压DP)

状压dp经典问题及代码 状态压缩经典问题及代码,TSP问题,状压dp.......................................... 立即下载

Looking for Order

Girl Lena likes it when everything is in order, and looks for order everywhere. Once she was getting ready for the University and noticed that the room was in a mess — all the objects from her handbag were thrown about the room. Of course, she wanted to put them back into her handbag. The problem is that the girl cannot carry more than two objects at a time, and cannot move the handbag. Also, if he has taken an object, she cannot put it anywhere except her handbag — her inherent sense of order does not let her do so.

You are given the coordinates of the handbag and the coordinates of the objects in some Сartesian coordinate system. It is known that the girl covers the distance between any two objects in the time equal to the squared length of the segment between the points of the objects. It is also known that initially the coordinates of the girl and the handbag are the same. You are asked to find such an order of actions, that the girl can put all the objects back into her handbag in a minimum time period.

Input

The first line of the input file contains the handbag's coordinates xs, ys. The second line contains number n (1 ≤ n ≤ 24) — the amount of objects the girl has. The following n lines contain the objects' coordinates. All the coordinates do not exceed 100 in absolute value. All the given positions are different. All the numbers are integer.

Output

In the first line output the only number — the minimum time the girl needs to put the objects into her handbag.

In the second line output the possible optimum way for Lena. Each object in the input is described by its index number (from 1 to n), the handbag's point is described by number 0. The path should start and end in the handbag's point. If there are several optimal paths, print any of them. 

Examples
Input

0 0
2
1 1
-1 1

Output

8
0 1 2 0 

Input

1 1
3
4 3
3 4
0 0

Output

32
0 1 2 0 3 0 
题意:

给n个物品的坐标, 和一个包裹的位置, 包裹不能移动。 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程。

分析:

首先我们会发现,如果我们选两个点i,j拿的话,起点为ni,j拿的话,起点为n那么先拿i还是先拿j是没有影响的

即他们距离总是dis[n][i]+dis[i][j]+dis[j][n]dis[n][i]+dis[i][j]+dis[j][n]

而且如果要选择这两个点的话,即每两个点若先事先分好哪两个点一起拿的话,那么点对的选取先后顺序同样不会影响结果

因此想到使用状压dp枚举状态,而这个状态就是只代表选与不选,与顺序无关

首先朴素的思想是枚举每种二进制状态

然后[0,n−1][0,n−1]一层循环枚举看哪个点ii没选,就选上,然后里面在一层循环枚举选取第二个没被选取的点j,注意当i=ji=j时,相当于选取的一个点,然后进行状态转移

当时刚才我们提到了选取点顺序无关,而我们如果像上面那样循环的话,必然会出现i,j和j,i这样就出现了重复,没有必要,因此枚举第二个点的循环从第一个点的位置往后再枚举就行了

但是这样选取点的复杂度仍然是O(n2)O(n2)再加上状态枚举总的复杂度是O(2n×n2)O(2n×n2)

实际上在枚举了一种状态下,我们只需要选取第一个没选的点进行状态转移了,仍然是我们上面分析的,如果已经分好了点对,即哪两个点一起选,那么点对的选取先后顺序也不会对结果产生影响,而且,枚举后面的状态的时候一定会选取到,也就是我们固定了点对的按第一个点编号从小到大选取顺序,这样只需要枚举到第一个没选取的点即可

复杂度降为O(2n×n)O(2n×n)

最后一定要注意按位运算符和==的优先级,==优先级大于&,所以一定注意加括号

code:

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int dp[1<<24],dis[25][25],pres[1<<24],path[550],cnt,n;
pair<int,int> a[25];
//dp[i]代表i状态下的最小值
//dis[i][j]表示i点到j点的距离
//pres[i]表示i状态的前一个状态是pres[i]状态
//path记录路径
int main(){
    int x,y;
    scanf("%d%d",&x,&y);
    scanf("%d",&n);
    a[n] = make_pair(x,y);
    for(int i = 0; i < n; i++){
        scanf("%d%d",&x,&y);
        a[i] = make_pair(x,y);
    }
    //预处理出每个点间的距离
    for(int i = 0; i <= n; i++){
        for(int j = 0; j <= n; j++){
            dis[i][j] = (a[i].first - a[j].first) * (a[i].first - a[j].first) + (a[i].second - a[j].second) * (a[i].second - a[j].second);
        }
    }
    memset(dp,inf,sizeof(dp));
    dp[0] = 0;
    for(int i = 0; i < (1 << n); i++){
        if(dp[i] == inf) continue;
        for(int j = 0; j < n; j++){
            if(((1 << j) & i) == 0){//如果j点没有拿,就拿
                for(int k = j; k < n; k++){//从j开始往后再拿一个,避免了重复
                    if(((1 << k) & i) == 0){
                        int tmp = i | (1 << j) | (1 << k);
                        int d = dis[j][k] + dis[n][j] + dis[n][k];
                        //特殊情况:当k=j相当于选取了一个点,此时就增加了j这个点,新增加的距离就是n->j,j->n即2*dis[n][j]
                        //其他情况:当k!=j相当于选取了两个点,此时新增加的距离为三段dis[j][k] + dis[n][j] + dis[n][k]
                        if(dp[tmp] > dp[i] + d){
                            dp[tmp] = dp[i] + d;//有点像最短路松弛操作
                            pres[tmp] = i;//记录下新状态的前一个状态
                        }
                    }
                }
                break;//对于每个枚举的状态我们只需要进行一次转移降低复杂度
                //即该状态下找到第一个没选取的点进行转移,后面点的选取就先不用枚举了
                //因为顺序不会影响结果,所以在枚举后面的状态的时候肯定还会枚举到
            }
        }
    }
    printf("%d\n",dp[(1<<n)-1]);
    for(int i = (1<<n)-1; i != 0; i = pres[i]){
        int tmp = pres[i] ^ i;//得到当前状态比前一个状态多的点
        path[cnt++] = 0;//每次先把起点放入
        for(int j = 0; j < n; j++){//枚举看看是哪个点
            if((1 << j) & tmp){
                path[cnt++] = j + 1;
            }
        }
    }
    path[cnt++] = 0;
    //因为是逆着存的所以逆着输出就是正向路径
    for(int i = cnt-1; i >= 0; i--){
        printf("%d ",path[i]);
    }
    return 0;
}
HCLR-Net: 混合对比学习正则化与局部随机扰动用于水下图像增强 独特贡献在于开发了一种处理负样本的新策略,既保留了负样本的统计特性,又防止网络过度剖析这些样本中的特征信息。通过根据每个通道特征的重要性对模型进行加权,我们可以增强富含上下文信息的通道,从而获得更准确、更详细的特征表示。AHA 模块利用垂直方向上的 Avgpool 和水平方向上的 Maxpool 来捕捉远程依赖关系和准确的位置信息,从而有效确定不同方向上的特征退化。对比学习策略通常旨在最小化正样本之间的欧氏距离,使预测图像更接近理想图像,同时最大化负样本与预测图像之间的距离,使它们进一步远离非理想表征。 阅读详情

相关推荐

SAP中错记虚拟利润中心的调整,冲销处理实例

我非CO专业顾问。工作中遇到的问题,也会找资料,分析,测试。有时这个过程会拿到结果,解决问题。遂将过程记录下来备查。读者请谨慎参考!EC-PCA: 利润中心记账流程_9ke0-优快云博客。

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 1795

#8 C. Looking for Order (状压dp + 路径记忆)

题目链接:点击打开链接 http://codeforces.com/contest/8/problem/C 题意: 給定原点 ( sx, sy ),以及 N 個坐标 X, Y。每次至多选两个坐标,依序拜访完后,回到原点。问你最好的路径,使得总路径最小。兩個坐标的路径长为欧几里得距离的平方。 题解: 看N(N 状压dp。 dp[ i ] : 已完成 i 的拜访,此时的最小总

LzyRapX 938

蓝桥杯历年真题分类汇总(史上最全版本,一定不要错过)

天再高又怎样,踮起脚尖就更接近阳光。 满满的 题型总结​ 历年真题​ 视频讲解​ 比赛技巧 题型总结 2021 2020 2019 2018 2017 2016 2015 2014 2013 ...

m0_58367586的博客 11万+

CodeForces 8 C.Looking for Order(状压DP)

Description 给出nnn个物品的二维坐标以及起点坐标,每次要从起点出去拿一件或两件物品回到起点,两点之间距离定义为欧氏距离的平方,问把所有物品拿回起点所走最短距离以及对应最短距离下拿物品的顺序 Input 首先输入两个整数sx,sysx,sysx,sy表示起点坐标,之后输入一整数nnn表示物品数量,最后nnn行每行两个整数xi,yixi,yix_i,y_i表示第iii个物品的坐标(...

ZSQ 473

保姆级教程:手把手教你从NASA Earthdata下载ASTER L2地表温度数据(附shp文件拖拽技巧)

本文提供了一份详细的NASA Earthdata平台ASTER L2地表温度数据下载教程,涵盖账号注册、数据筛选、shp文件拖拽技巧及质量检查等关键步骤。特别适合遥感领域初学者,帮助快速掌握高效获取ASTER L2T数据的方法,适用于城市热岛效应和农业监测等研究。

weixin_30736301的博客 469

非华为电脑与MatePad Pro多屏协同实战:从安装管家到攻克连接难题

本文详细介绍了在非华为电脑上安装华为电脑管家并实现与MatePad Pro多屏协同的完整指南。从安装步骤、常见连接失败解决方案到华为账号绑定技巧,提供了实用的操作方法和硬件优化建议,帮助用户攻克连接难题,提升多屏协同的稳定性和流畅度。

weixin_30263073的博客 232

Codeforces 8C Looking for Order(状态压缩DP)

Girl Lena likes it when everything is in order, and looks for order everywhere. Once she was getting ready for the University and noticed that the room was in a mess — all the objects from her handbag were thrown about the room. Of course, she wanted to pu

风的记忆 513

英飞凌AURIX™ Development Studio(ADS)工程调试与烧录实战指南

本文详细介绍了英飞凌AURIX™ Development Studio(ADS)的工程调试与烧录实战指南。从调试环境搭建、硬件连接到断点设置、变量监控等核心调试技巧,帮助开发者快速掌握ADS安装使用教程,提升多核处理器开发效率。

k8l9m0n的博客 570

CF 8C Looking for Order

模板题,dp数组下标表示当前状态,拿物品的顺序无所谓,所以从最低位没拿的开始拿,是否顺路拿第二个或者不拿有24种状态。 #include #include #include #include using namespace std; #define N 25 #define INF 1000000000 int x0,y0; int n; struct CO { int x; i

DBL 755

STM32嵌入式开发实战:如何用miniLZO压缩算法节省70%存储空间(附完整工程)

本文详细介绍了如何在STM32嵌入式开发中使用miniLZO无损压缩算法实现高达70%的存储空间节省。通过对比分析不同轻量级算法,重点讲解miniLZO的内存优化配置、分块压缩策略和完整工程实现,帮助开发者有效解决嵌入式系统中的存储瓶颈问题。

ss78901的博客 881

linux内核学习(一)---内核社区介绍及补丁提交

本系列开始会对linux内核进行系统性的学习,以源码与内核社区为基础,了解前沿的内核机制,同时也深度了解linux内核中的一些经典机制 本章会先对linux内核社区进行简单的介绍,包括源码下载、内核社区的修改提交

文艺小少年的博客 536

CF8C Looking for Order 题解

题目链接 分析: 跟愤怒的小鸟没什么区别啊~~,还简单一些 看这篇就好了 注意要输出方案,开一个数组记录从哪转移来的就好了 Code: #include <iostream> #include <cstdio> using namespace std; const int maxn = 25,inf = 1e9; int n,maxs,x[maxn],y[maxn],f[1...

一只蒟蒻的博客 281

【定位模块项目实战】gnss_localizer、lidar_localizer功能包解析

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、1.2.3.4.二、1.2.3.4.三、1.2.3.4.四、1.2.3.4.总结参考资料 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对**【无人驾驶autoware项目实战】感知–定位模块**做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、 1. 2. 3. 4. . . 二、

qq_35635374的博客 1931

【题解】codeforces 8c Looking for Order 状压dp

题目描述 Lena喜欢秩序井然的生活。一天,她要去上大学了。突然,她发现整个房间乱糟糟的——她的手提包里的物品都散落在了地上。她想把所有的物品都放回她的手提包。但是,这里有一点问题:她一次最多只能拿两个物品,她也不能移动她的手提包。并且,因为她爱整洁的习惯,如果她拿起了一个物品,她也不能将它放在其他地方,除非放回她的手提包。 Lena把她的房间划分为了一个平面直角坐标系。现在Le...

C@bMv7GRVt)Q 241

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Codeforces Beta Round 8 C. Looking for Order 【状压DP】

个人练习记录

m0_73500785的博客 986

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

CF8C Looking for Order(状压dp)

Description 平面坐标系中有 nnn 个物品 (x1∼n,y1∼n)(x_{1\sim n},y_{1\sim n})(x1∼n​,y1∼n​),从 (x1,y1)(x_1,y_1)(x1​,y1​) 走到 (x2,y2)(x_2,y_2)(x2​,y2​) 所需的时间为 (x1−x2)2+(y1−y2)2(x_1 - x_2)^2 + (y_1 - y_2)^2(x1​−x2​)2+(...

ylxmf2005's Blog 264

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Codeforces 8C Looking for Order(状压DP)

C. Looking for Order time limit per test 4 seconds memory limit per test 512 megabytes input standard input output standard output Girl Lena likes it when everything is

yasolx的博客 859

【状压DP】【CF8C】 Looking for Order

传送门 Description 给你n个点,每次可以从起点到最多两个点然后回到起点。求经过每个点最少一次的最短欧氏距离和是多少 Input 第一行是起点的坐标 第二行是点的个数\(n\) 下面\(n\)行是需要进过的点的坐标 Output 输出最短欧氏距离以及方案。方案是经过每个点的顺序。起点为\(0\)号点 Hint \(For~All:\) \(0~\leq~n~\leq~24\) Solut...

weixin_34259559的博客 121

Codeforces 8C. Looking for Order(状压DP,回溯状态)

Girl Lena likes it when everything is in order, and looks for order everywhere. Once she was getting ready for the University and noticed that the room was in a mess — all the objects from her handbag were thrown about the room. Of course, she wanted to pu

tomjobs的博客 577

【Codeforces】CF 8 C Looking for Order(状压dp)

题目 传送门:QWQ 分析 这种题不会做 吃枣药丸。。。。。 想到状压已经经过的点。 然后更新时枚举两个点加进去。 复杂度$ {O(2^n \times n^2)}$。 凉凉。 真正的做法是每一个状态只要找到一组解就break。这样可以省掉一层n。 大致上就像lrj紫书的dp例题一样,反正这个点都要选,那就先选了他。 还不是很懂这个神奇的break。。。。。 ...

weixin_30458043的博客 131

CF 8C Looking for Order(状压dp)

C. Looking for Order time limit per test 4 seconds memory limit per test 512 megabytes input standard input output standard output Girl Lena likes it when everything is

记录成长的点点滴滴. . . . . 1162

CodeForces - 8C Looking for Order (两种方法的实现:状压DP,DFS)

Girl Lena likes it when everything is in order, and looks for order everywhere. Once she was getting ready for the University and noticed that the room was in a mess — all the objects from her handbag...

bibibi724 494

Codeforces Beta Round #8 C. Looking for Order 状压dp

题目链接: http://codeforces.com/problemset/problem/8/C C. Looking for Order time limit per test:4 secondsmemory limit per test:512 megabytes 问题描述 Girl Lena likes it when everything is in order, and looks...

weixin_30668887的博客 153

Codeforces Beta Round #8 C. Looking for Order 状压DP,路径记录

题目链接:http://codeforces.com/contest/8/problem/C 题意:平面上有n个物品,这个小朋友会去拿这些物品,然后拿到返回包的位置。但是这个小朋友一次最多拿两个物品,问你怎么去拿,才能使得把所有物品都拿到包的位置,且走的距离和最小 解法: 比较显然的状压,状压中有一个剪枝,显然拿的顺序是随意的,我先拿和后拿都是一样的。所以可以直接return就好了。这题质量感觉

I good vegetable a! 639

【CodeForces】【DP】8C Looking for Order

CodeForces 8C Looking for Order 题目 ◇题目传送门◆ 题目大意 在一个平面直角坐标系中散落着NNN件物品,每件物品的坐标为整数,标号为1…N1…N1\ldots N。定义两点A,BA,BA,B间距离为(Ax−Bx)2+(Ay−By)2(Ax−Bx)2+(Ay−By)2(A_x-B_x)^2+(A_y-B_y)^2。给定收纳箱的位置,将收纳箱标号...

IDDFS 288

CF8C Looking for Order

CF8C Looking for Order 状压dp 令f[state]表示当前已放置状态为state时的最小代价 f[state|i|j]=min(f[state|i|j],f[state]+dis(0,i)+dis(i,j)+dis(j,0)); i,j可以相等 然后: 59640780 Aug...

216
上一篇: Find a way HDU - 2612(两起点bfs)
下一篇: LCM Walk HDU - 5584(数论+思维)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值