P1433 吃奶酪(洛谷)状压dp解法
嗯?这题竟然是个绿题。
这个题真的不(很)难,我们只是不会计算2点之间的距离,他还给出了公式,这个就有点……

我们直接套公式去求出需要的值,然后普通的状压dp就可以了。
是的状压dp。
这个题的数据加强了,早已经不是搜索可以驾驭的了。
搜索的效率实在是有点低,我来算一个不准的效率,搜索的效率应该是O(n!)。应该是吧。
状压dp只需要短短的O(2^n*n*n就可以了)。状态共有2^n*n个,每次查找下一步需要O(n)的效率,所以状压dp的效率是O(2^n*n*n)。
状压dp用一个二进制数表示哪个奶酪曾经吃过,我们先看看这些二进制数的基本操作:不知道与,或,异或运算的可以百度一下。
第一种操作,查询第i个奶酪有没有吃过。
x表示现在奶酪的情况(2进制数)
我们要判断第i个奶酪有没有被吃
if((x&(1<<i-1))==0)
这样写就可以啦。其中&的意思是按位与运算,就是说在2进制下,2位同时为1,结果才为1,也就是说,如果第i个奶酪被吃掉了,x那一位就是1,按位与运算后的结果也是1,如果按位与运算后的结果是0,第i个奶酪就没有被吃掉。
第二种操作,吃掉第i个奶酪后,x会变成什么样子?
x=x|(1<<i-1)
这样写,|是按位或运算,就是在二进制里,2位有一个为1,结果为1,1<<i-1的第i位是1,和x进行按位或运算就让x的第i位也变成1了。
做这个题只需要这两个操作,剩下的操作有兴趣的同学可以去百度一下。
接下来就是代码了:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
double a[20],b[20],shu=999999.0;//初始化
double dp[40000][20];
double sz[20][20];//sz[i][j]是表示第i个奶酪到第j个奶酪有多远。
long long n;
int main()
{
scanf("%lld",&n);
for(int i=0;i<(1<<n);i++)
{
for(int j=1;j<=n;j++)
{
dp[i][j]=999999.0;//还是初始化
}
}
for(int i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
}
a[0]=0;//依然是初始化
b[0]=0;//因为老鼠一开始在0,0的位置。
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
sz[i][j]=sqrt((a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]));//公式摆着呢,题目给了。
}
}
for(int i=1;i<=n;i++)//1<<i-1是把1左移i-1位,在二进制就是第i位是1。dp[i][j]中的i表示现在的情况(二进制数),j表示现在在哪个奶酪哪里。dp[i][j]的值就是达成这个局势最少走多远。
{
dp[1<<i-1][i]=sz[0][i];
}
for(int i=1;i<=(1<<n)-1;i++)//所有情况,也就是n个1,也就是(1<<n)-1。
{
for(int j=1;j<=n;j++)//在第j个奶酪处。
{
if(dp[i][j]!=999999)//这种情况不可能,比如i=1,j=2;
{
for(int k=1;k<=n;k++)//他的起始点出现过,搜索还能走到哪个奶酪处。
{
if((i&(1<<k-1))==0)//这个奶酪处没来过。
{
dp[i|(1<<k-1)][k]=min(dp[i|(1<<k-1)][k],dp[i][j]+sz[j][k]);//来这个奶酪处。判断一下这样走是不是最近的。
}//有2种可能,第一,之前来过,而且走的距离比这次小,第二种,这次走的距离加上目前位置到第k个奶酪的距离是最短的。反正我们直接找最短的就好。
}
}
}
}
for(int i=1;i<=(1<<n)-1;i++)
{
for(int j=1;j<=n;j++)
{
if(i==(1<<n)-1)
{
shu=min(shu,dp[i][j]);//这里为了方便查找错误写的,可以更优化一点,但没必要。
}
}
}
printf("%.2f",shu);//输出。
return 0;
}
好了,这个题目就这么愉快的讲完了。
P1433 吃奶酪(洛谷)状压dp解法的更多相关文章
- 吃奶酪 洛谷 p1433
题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...
- P6085-[JSOI2013]吃货JYY【状压dp,欧拉回路】
正题 题目链接:https://www.luogu.com.cn/problem/P6085 题目大意 \(n\)个点的一张无向图,有\(k\)条必走边,\(m\)条其他边,求从\(1\)出发经过必走 ...
- 最短Hamilton路径-状压dp解法
最短Hamilton路径 时间限制: 2 Sec 内存限制: 128 MB 题目描述 给定一张 n(n≤20) 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamil ...
- 有关状压DP
[以下内容仅为本人在学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!] 引言 动态规划虽然已经是对暴力算法的优化,但在某些比较特别的情况下,可以通过一 ...
- 洛谷 P1433 吃奶酪 状压DP
题目描述 分析 比较简单的状压DP 我们设\(f[i][j]\)为当前的状态为\(i\)且当前所在的位置为\(j\)时走过的最小距离 因为老鼠的坐标为\((0,0)\),所以我们要预处理出\(f[1& ...
- 洛谷P3959 宝藏(NOIP2017)(状压DP,子集DP)
洛谷题目传送门 Dalao的题解多数是什么模拟退火.DFS剪枝.\(O(3^nn^2)\)的状压DP之类.蒟蒻尝试着把状压改进了一下使复杂度降到\(O(3^nn)\). 考虑到每条边的贡献跟它所在的层 ...
- 【题解】洛谷P3959 [NOIP2017TG] 宝藏(状压DP+DFS)
洛谷P3959:https://www.luogu.org/problemnew/show/P3959 前言 NOIP2017时还很弱(现在也很弱 看出来是DP 但是并不会状压DP 现在看来思路并不复 ...
- 【题解】洛谷P2704 [NOI2001] 炮兵阵地(状压DP)
洛谷P2704:https://www.luogu.org/problemnew/show/P2704 思路 这道题一开始以为是什么基于状压的高端算法 没想到只是一道加了一行状态判断的状压DP而已 与 ...
- 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...
随机推荐
- ca70a_c++_重载函数_实参类型转换
/*ca70a_c++_重载函数_实参类型转换转换等级,详见P290 编译选择哪个函数版本呢?1.精确匹配2.通过类型提升3.通过标准转换4.通过类类型转换参数匹配和枚举类型重载和const形参 vo ...
- JavaWeb网上图书商城完整项目--25.注册页面之隐藏没有内容的错误信息实现
在上一章中我们显示的效果如下所示: 上面后面都有错误的红色×的显示,这样是不对的,我们要解决该问题 我们要循环遍历每一个错误的信息,看它的内容有没有,如果有内容我们就显示错误的×,如果没有就不显示× ...
- java scoket Blocking 阻塞IO socket通信三
在NIO同步非阻塞的场景中和原来同步阻塞最大的却别就是引入了上面的Buffer对象,现在我们来学校上面的BUffer对象 我们来看看程序的代码: package bhz.nio.test; impor ...
- SpringBoot——项目启动时读取配置及初始化资源
介绍 在开发过程中,我们有时候会遇到非接口调用而出发程序执行任务的一些场景,比如我们使用quartz定时框架通过配置文件来启动定时任务时,或者一些初始化资源场景等触发的任务执行场景. 方法一:注解 ...
- Python实用笔记 (9)高级特性——列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, ...
- Python实用笔记 (7)高级特性——切片
列表L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] 取前3个元素 >>> L[0:3] ['Michael', 'Sarah', ' ...
- Java 从入门到进阶之路(二十六)
在之前的文章我们介绍了一下 Java 中的 集合框架中的Collection 的子接口 List,本章我们来看一下 Java 集合框架中的Collection 的子接口 Queue. 在之前我们讲 ...
- 04 . kubernetes资源清单YAML入门
YAML 通过k8s操作yaml配置文件在node上创建资源,yaml配置文件就像船垛,用来操控docker这艘大船 yam是专门用来写配置文件的语言,非常简洁和强大.而实际上使用yaml配置文件创建 ...
- python基础知识练习1
1.要求:输入A.B.C获得方程的解. 分析:通过input函数接收A,B,C的值.通过公式计算出detal的值,再根据条件进行判断,输出所需要的值: def args_input(): try: A ...
- Alink漫谈(十) :特征工程 之 特征哈希/标准化缩放
Alink漫谈(十) :特征工程之特征哈希/标准化缩放 目录 Alink漫谈(十) :特征工程之特征哈希/标准化缩放 0x00 摘要 0x01 相关概念 1.1 特征工程 1.2 特征缩放(Scali ...