传送门

深搜加剪纸可A(O(玄学) 1274ms)

——代码

 #include <cmath>
#include <cstdio>
#include <iostream> int n;
double ans = ~( << ), a[], b[];
bool vis[]; inline double min(double x, double y)
{
return x < y ? x : y;
} inline double query(int x, int y)
{
return sqrt((a[x] - a[y]) * (a[x] - a[y]) + (b[x] - b[y]) * (b[x] - b[y]));
} inline void dfs(int now, double sum, int k)
{
if(k == n + )
{
ans = min(ans, sum);
return;
}
if(sum > ans) return;
for(int i = ; i <= n; i++)
if(!vis[i])
{
vis[i] = ;
dfs(i, sum + query(now, i), k + );
vis[i] = ;
}
} int main()
{
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%lf %lf", &a[i], &b[i]);
dfs(, , );
printf("%.2lf\n", ans);
return ;
}

然而状压DP,稳一手(据说O(n2*2n) 73ms)

采用记忆化搜索。

设f[i][S]为已经走过的点的集合为S,当前停留在点i的最短距离

f[i][S] = f[j][S - i] + dis(i, j) (i, j ∈ S && i != j)

——代码

 #include <cmath>
#include <cstdio> const int INF = 1e9;
int n;
double ans, a[], b[], f[][ << ]; inline double dist(int i, int j)
{
return sqrt((a[i] - a[j]) * (a[i] - a[j]) + (b[i] - b[j]) * (b[i] - b[j]));
} inline double min(double x, double y)
{
return x < y ? x : y;
} inline int istrue(int x, int S)
{
return ( << x - ) & S;
} inline int set0(int x, int S)
{
return (~( << x - )) & S;
} inline void dfs(int now, int S)
{
if(f[now][S] != -) return;
f[now][S] = INF;
for(int i = ; i <= n; i++)
{
if(i == now) continue;
if(!istrue(i, S)) continue;
dfs(i, set0(now, S));
f[now][S] = min(f[now][S], f[i][set0(now, S)] + dist(i, now));
}
} int main()
{
int i, j;
scanf("%d", &n);
for(i = ; i <= n; i++) scanf("%lf %lf", &a[i], &b[i]);
for(i = ; i <= n; i++)
for(j = ; j < ( << n); j++)
f[i][j] = -;
for(i = ; i <= n; i++) f[i][ << i - ] = dist(, i);
for(i = ; i <= n; i++) dfs(i, ( << n) - );
ans = INF;
for(i = ; i <= n; i++) ans = min(ans, f[i][( << n) - ]);
printf("%.2lf\n", ans);
return ;
}

用递推更简便(68ms)

——代码

 #include <cmath>
#include <cstdio>
#include <cstring> const int INF = 1e9;
int n, m;
double ans, a[], b[], f[][ << ]; inline double dist(int i, int j)
{
return sqrt((a[i] - a[j]) * (a[i] - a[j]) + (b[i] - b[j]) * (b[i] - b[j]));
} inline double min(double x, double y)
{
return x < y ? x : y;
} int main()
{
int i, j, S, x, y;
scanf("%d", &n);
m = ( << n) - ;
for(i = ; i <= n; i++) scanf("%lf %lf", &a[i], &b[i]);
memset(f, 0x7f, sizeof(f));
for(i = ; i <= n; i++) f[i][ << i - ] = dist(, i);
for(S = ; S <= m; S++)
for(i = ; i <= n; i++)
{
if(!(( << i - ) & S)) continue;
for(j = ; j <= n; j++)
{
if(i == j) continue;
if(!(( << j - ) & S)) continue;
f[i][S] = min(f[i][S], f[j][( << i - ) ^ S] + dist(j, i));
}
}
ans = INF;
for(i = ; i <= n; i++) ans = min(ans, f[i][m]);
printf("%.2lf\n", ans);
return ;
}

[luoguP1433] 吃奶酪(DP || Dfs)的更多相关文章

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

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

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

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

  3. [状压DP]吃奶酪

    吃 奶 酪 吃奶酪 吃奶酪 题目描述 房间里放着 n n n 块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 ( 0 , 0 ) (0,0) (0,0)点处. 输入 第一行有一个整 ...

  4. 解题报告:luogu P1433 吃奶酪

    题目链接:P1433 吃奶酪 我感觉可以改成:[模板]TSP问题(商旅问题) 了. 爆搜\(T\)一个点,考虑状压\(dp\)(还是爆搜). 我们用\(dp[i][j]\)表示现在是\(i\)状态,站 ...

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

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

  6. BZOJ-4424 &&CodeForces-19E Fairy DP+dfs (Link-Cut-Tree可A)

    Va爷的胡策题T2 E. Fairy time limit per test1.5 seconds memory limit per test256 megabytes inputstandard i ...

  7. 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence

    题目传送门 /* 记忆化搜索(DP+DFS):dp[i][j] 表示第i到第j个字符,最少要加多少个括号 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 当 ...

  8. HDU 4272 LianLianKan (状压DP+DFS)题解

    思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...

  9. HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca

    Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...

随机推荐

  1. 运行Android Studio总是未发现设备

    1.未发现虚拟机设备

  2. weiphp插件开发注意

    插件命名要规范,插件名文件名,控制器名,模型名要以大写开头.不然的话会有惊喜!╮(╯▽╰)╭

  3. Django day 34 过滤课程,登录,redis,python操作redis

    一:过滤课程, 二:登录 三:redis, 四:python操作redis

  4. post和get区别,其他答案真的太坑

    原理: get和post都是http定义与服务器交互的方法,还有put,delete url是网络上的资源,那么http中的get,post,put,delete对应的就是对这个资源的查,改,增,删四 ...

  5. [NOI2003]Editor

    Description 很久很久以前,DOS3.x的程序员们开始对 EDLINEDLIN 感到厌倦. 于是,人们开始纷纷改用自己写的文本编辑器?? 多年之后,出于偶然的机会,小明找到了当时的一个编辑软 ...

  6. 257 Binary Tree Paths 二叉树的所有路径

    给定一个二叉树,返回从根节点到叶节点的所有路径.例如,给定以下二叉树:   1 /   \2     3 \  5所有根到叶路径是:["1->2->5", " ...

  7. Code Kata:大整数四则运算—除法 javascript实现

    除法不可用手工算法来计算,其基本思想是反复做减法,看从被除数里面最多能减去多少个除数,商就是多少. 除法函数: 如果前者绝对值小于后者直接返回零 做减法时,不需要一个一个减,可以以除数*10^n为基数 ...

  8. WEB-CSS实现单行(多行)文本溢出显示省略号

    //单行文本溢出部分隐藏显示省略号...overflow: hidden; text-overflow:ellipsis; white-space: nowrap; /** n 行文本溢出部分隐藏显示 ...

  9. 61配置nanopim1plus的HDMI为1080p输出

    61配置nanopim1plus的HDMI为1080p输出 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2018/4/4 10:21 版本:V1.1 开 ...

  10. Android集成微信分享功能应用签名生成方法及分享不生效的问题

    通过友盟sdk集成微博.微信.qq等分享功能时,微博和qq很顺利,但在做微信集成时一直不成功.主要问题还是之前在微信开放平台申请创建移动应用时,对应用签名没有填写对,走了很多弯路现总结出来,加深记忆避 ...