Codeforces 8C 状压DP
题意:有个人想收拾行李,而n个物品散落在房间的各个角落里(n < 24)。现在给你旅行箱的坐标(人初始在旅行箱处),以及n个物品的坐标,你一次只能拿最多两个物品,并且拿了物品就必须放回旅行箱,不能暂时放在地上。问最小的花费是多少?花费是笛卡尔距离的平方。
思路一看n 只有24,应该很容易想到要用状压DP. 那么dp[i]表示i状态并且回到原点的最小花费。那么就暴力枚举拿1个或两个物品放回原点,然后转移就行了。需注意,这个题目中拿物品的顺序对答案无影响,比如先拿1号,再拿2号和先拿2号,再拿1号的花费是一样的。然后满怀欣喜的交了一发,TLE了。。。。我们对题目的性质发掘的不够,既然枚举的时候拿物品的顺序对答案没影响,那么我们状态转移的时候顺序改变对答案没影响。比如现在有1, 2, 3, 4这4个物品没有选,那么先选1, 2再选3,4和先选3,4再选1, 2答案是一样的。所以我们枚举的时候,找到与之前没选过的最靠前的一个,再找出与这个对应的其它状态去更新就可以了。
代码:
#include <bits/stdc++.h>
#define pii pair<int, int>
using namespace std;
const int maxn = 30;
int dis(pii x, pii y) {
return (x.first - y.first) * (x.first - y.first) + (x.second - y.second) * (x.second - y.second);
}
int dp[1 << 24], pre[1 << 24];
pii s, a[maxn];
int n;
int cost[30][30];
void print(int now) {
if(now == 0) {
printf("0 ");
return;
}
print(now ^ pre[now]);
for (int i = 0; i < n; i++) {
if((pre[now] >> i) & 1)
printf("%d ", i + 1);
}
printf("0 ");
}
int main() {
scanf("%d%d",&s.first, &s.second);
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d%d", &a[i].first, &a[i].second);
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
// int now = (1 << i) | (1 << j);
// re.push_back(now);
int tmp1 = dis(s, a[i]);
if(i != j) {
tmp1 += dis(a[i], a[j]);
tmp1 += dis(a[j], s);
} else {
tmp1 += dis(a[i], s);
}
//dist.push_back(tmp1);
cost[i][j] = tmp1;
}
memset(dp, 0x3f, sizeof(dp));
dp[0] = 0;
for (int i = 0; i < (1 << n); i++) {
for (int j = 0; j < n; j++) {
if((i >> j) & 1) continue;
for (int k = j; k < n; k++){
if((i >> k) & 1) continue;
int now = (1 << j) | (1 << k);
if(dp[i | now] > dp[i] + cost[j][k]) {
dp[i | now] = min(dp[i | now], dp[i] + cost[j][k]);
pre[i | now] = now;
}
}
break;
}
}
printf("%d\n", dp[(1 << n) - 1]);
print((1 << n) - 1);
}
Codeforces 8C 状压DP的更多相关文章
- Codeforces 678E 状压DP
题意:有n位选手,已知n位选手之间两两获胜的概率,问主角(第一个选手)最终站在擂台上的概率是多少? 思路:一看数据范围肯定是状压DP,不过虽然是概率DP,但是需要倒着推:我们如果正着推式子的话,初始状 ...
- Codeforces 1215E 状压DP
题意:给你一个序列,你可以交换序列中的相邻的两个元素,问最少需要交换多少次可以让这个序列变成若干个极大的颜色相同的子段. 思路:由于题目中的颜色种类很少,考虑状压DP.设dp[mask]为把mask为 ...
- CodeForces 11D(状压DP 求图中环的个数)
Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no re ...
- codeforces 1185G1 状压dp
codeforces 1185G1. Playlist for Polycarp (easy version)(动态规划) 传送门:https://codeforces.com/contest/118 ...
- Codeforces 1155F 状压DP
题意:给你一张图,问最少保留多少条边,使得这张图是边双联通分量. 思路:如果一个点集中的点已经是边双联通分量,那么从这个点集中的点x出发,经过若干个不是点集中的点,回到点集中的点y(x可能等于y),那 ...
- Codeforces - 71E 状压DP
参考官方题解 #include<bits/stdc++.h> #define rep(i,j,k) for(register int i=j;i<=k;i++) #define rr ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- 【题解】codeforces 8c Looking for Order 状压dp
题目描述 Lena喜欢秩序井然的生活.一天,她要去上大学了.突然,她发现整个房间乱糟糟的--她的手提包里的物品都散落在了地上.她想把所有的物品都放回她的手提包.但是,这里有一点问题:她一次最多只能拿两 ...
- codeforces Diagrams & Tableaux1 (状压DP)
http://codeforces.com/gym/100405 D题 题在pdf里 codeforces.com/gym/100405/attachments/download/2331/20132 ...
随机推荐
- 【ORM】关于Dapper的一些常见用法
引言 Dapper是.Net平台下一款小巧玲珑的开源Orm框架,简单实用的同时保持高性能,非常适合我这种喜欢手写SQL的人使用,下面介绍一下如何使用Dapper. 相关资料 Dapper的GitHub ...
- Spring_总结_03_装配Bean(二)_Java配置
一.前言 本文承接上一节:Spring_总结_03_装配Bean(一)之自动装配 上一节提到,装配Bean有三种方式,首先推荐自动装配.当自动装配行不通时,就需要采用显示配置的方式了. 显示配置有两种 ...
- Log4j_学习_03_自己动手封装log工具
二.参考资料 1.log4j 是否可以通过条件判断 在程序运行中动态选择日志存储目录 2.log4j删除N天前日志实现
- mac环境下利用MAMP配置PHPStorm
刚刚准备搞php稍微研究一下,结果第一步就卡到了.各种配置问题,教程找了又找,找了又找,总算是成功了.纪念一下.配置截图.同时解决phpstorm 不能接受post 表单数据的问题. 推荐大家支持正版 ...
- C#多线程操作
static void Main(string[] args) { Thread thread = Thread.CurrentThread; thread.Name = "Main Thr ...
- UVA - 11107 Life Forms (广义后缀自动机)
题意:给你n个字符串,求出在超过一半的字符串中出现的所有子串中最长的子串,按字典序输出. 对这n个字符串建广义后缀自动机,建完后每个字符串在自动机上跑一遍,沿fail树向上更新所有子串结点的出现次数( ...
- BZOJ5336: [TJOI2018]party
BZOJ5336: [TJOI2018]party https://lydsy.com/JudgeOnline/problem.php?id=5336 分析: 好题. 正常的思路是设\(f[i][j] ...
- h5废弃的标签和属性及新增的标签和属性
一.废弃的标签和属性 1.表现性元素 a) basefont b) big c) center d) font e) strike f) tt 2.框架类元素 a) frame b) frameset ...
- C# 读xml注释或过滤xml注释
有这么个需求: 要统计所有的配置文件,这些配置文件都xml格式,并把这些配置写到数据表里,如果有注释要把这些注释写到对应配置对象的描述字段上 <item id="" key= ...
- 如何打开 Windows 的热键提示
如何打开 Windows 的热键提示 很早之前我记的 Windows 是有热键提示的,不知道什么时候开始默认不显示了,难道 微软是为是美观? 找了一下原来是有地方可以设置的.