题目链接:P1433 吃奶酪

我感觉可以改成:【模板】TSP问题(商旅问题) 了。

爆搜\(T\)一个点,考虑状压\(dp\)(还是爆搜)。

我们用\(dp[i][j]\)表示现在是\(i\)状态,站在了\(j\)点。

那什么是状态呢? 我们用一个\(01\)串表示每一点有无被走过(\(0\)是没走过,\(1\)是已走过),那么转移方程就是:

\[dp[i][j]=min(dp[i][j],dp[i\&((1<<n)-1-(1<<(j-1)))][k]+dis[j][k])
\]

好好理解下,就是吃掉走过的每一点。

复杂度就是\(O(2^nn^2)\),对于\(n\leqslant15\)的数据,上界为\(7372800\),可以通过本题,还跑得挺快。

\(Code\):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
struct node
{
double x,y;
}a[17];
int n;
double dp[65005][17];
double minn=21247483647;
double dis(node m,node n){return sqrt((m.x-n.x)*(m.x-n.x)+(m.y-n.y)*(m.y-n.y));}
int main()
{
scanf("%d",&n);
for(int i=1;i<=(1<<15);i++)
{
for(int j=1;j<=15;j++) dp[i][j]=214748364;
}
for(int i=1;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y);
for(int i=1;i<=n;i++) dp[1<<(i-1)][i]=0;//从零开始扫会RE
for(int i=1;i<=(1<<n)-1;i++)
{
for(int j=1;j<=n;j++)
{
if(!(1<<(j-1)&i)) continue;
for(int k=1;k<=n;k++)
{
if(j==k) continue;
if(!(1<<(k-1)&i)) continue;
dp[i][j]=min(dp[i][j],dp[i&((1<<n)-1-(1<<(j-1)))][k]+dis(a[j],a[k]));
}
}
}
node e;
e.x=e.y=0;
for(int i=1;i<=n;i++) minn=min(minn,dp[(1<<n)-1][i]+dis(a[i],e));
//注意这里把原点算上
printf("%.2lf\n",minn);
return 0;
}

转移方程有简单点的写法:

\[dp[i][j]=min(dp[i][j],dp[i-(1<<(j-1))][k]+dis[j][k])
\]

被骗了吧......

解题报告:luogu P1433 吃奶酪的更多相关文章

  1. 【luogu】 P1433 吃奶酪

    题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块奶酪的坐标. ...

  2. 洛谷 P1433 吃奶酪【DFS】+剪枝

    题目链接:https://www.luogu.org/problemnew/show/P1433 题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处 ...

  3. 洛谷P1433 吃奶酪 题解 状态压缩DP

    题目链接:https://www.luogu.com.cn/problem/P1433 题目大意 房间里放着 \(n\) 块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 \((0, ...

  4. 洛谷P1433 吃奶酪【dfs】【剪枝】

    题目:https://www.luogu.org/problemnew/show/P1433 题意: 给定n个坐标,要求从(0,0)开始走遍所有点,最少经过的路程. 思路: 刚开始想像数字三角形一样适 ...

  5. 洛谷 - P1433 - 吃奶酪 - dfs

    https://www.luogu.org/problemnew/show/P1433 并不是每一个求最短距离就是bfs,这个肯定是dfs. 直接计算15!可以知道枚举必定超时,但是! 我们dfs非常 ...

  6. 洛谷 P1433 吃奶酪(记忆化)

    题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...

  7. 洛古——P1433 吃奶酪

    https://www.luogu.org/problem/show?pid=1433 题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输 ...

  8. P1433 吃奶酪(洛谷)状压dp解法

    嗯?这题竟然是个绿题. 这个题真的不(很)难,我们只是不会计算2点之间的距离,他还给出了公式,这个就有点…… 我们直接套公式去求出需要的值,然后普通的状压dp就可以了. 是的状压dp. 这个题的数据加 ...

  9. 集训作业 洛谷P1433 吃奶酪

    嗯?这题竟然是个绿题. 这个题真的不难,不要被他的难度吓到,我们只是不会计算2点之间的距离,他还给出了公式,这个就有点…… 我们直接套公式去求出需要的值,然后普通的搜索就可以了. 这个题我用的深搜,因 ...

随机推荐

  1. 修改环境变量后,导致一些常用命令失效,如ll,ls,vi不能用

    因为一不小心将linux的环境变量修改错误,导致ll之类的常用命令都不能用,很是苦恼,通过百度查询,原来在敲命令时,敲完整的命令路径,还是可以的: 原文地址:http://www.cnblogs.co ...

  2. 如何在centos里面安装php-posix

    今天在虚拟机上安装一个系统的插件,出现了You must have POSIX and PCNTL functions to use Video Process,搜了一下缺少插件,那接下来就是安装了. ...

  3. websocket对象及方法

    # websocket对象及方法 1.websocket对象 以下 API 用于创建 WebSocket 对象. var Socket = new WebSocket(url, [protocol] ...

  4. 操作Document文档

    利用客户端操作Document文档数据 1.创建一个文档(创建数据的过程,向表中去添加数据) 请求方式:Post 请求地址:es所在IP:9200/索引库/Type/文档ID(可给可不给,代表唯一标识 ...

  5. MyBatis中关于session以及cache的管理

    Mybatis中缓存分为一级缓存与二级缓存: 一级缓存指的只是缓存级别的一个命名,主要就是每个sqlsession里都有一个HashMap来存储数据,当然不同对象每个缓存区域也不一样,所以一级缓存是不 ...

  6. 剑指offer系列——62.二叉搜索树的第k个结点

    Q:给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. T: 中序遍历,递归: int count = 0; public ...

  7. python第四节【函数】

    函数 1. 函数 def greet_user(): """显示简单的问候语""" print("Hello") gre ...

  8. dubbo-admin监控台的搭建

    一.dubbo-admin dubbo-admin是dubbo的控制台web程序,可以利用浏览器对dubbo进行性能监控.服务治理.降级.分组以及一些参数的设置.2.6版本及以前打包后是一个war包, ...

  9. MySQL8.0.11安装后,使用CMD无法启动mysql服务

    首先,先把mysql的bin路径添加到系统环境变量 这样做可以,直接进入CMD后执行mysql服务,不需要进入mysql的bin文件路径去执行. 第一步:在MySQL的安装文件的bin目录(例如:C: ...

  10. ASP.NET Core搭建多层网站架构【7-使用NLog日志记录器】

    2020/01/29, ASP.NET Core 3.1, VS2019, NLog.Web.AspNetCore 4.9.0 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站 ...