传送门

深搜加剪纸可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. bzoj 1232: [Usaco2008Nov]安慰奶牛cheer【最小生成树】

    有趣 每条边在算答案的时候被算了二倍的边权值加上两个端点的权值,然后睡觉点额外加一次 所以可以用这个权做MST,然后加上点权最小的点 #include<iostream> #include ...

  2. P3953 逛公园(dp,最短路)

    P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张NN个点MM条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,NN号点是公园的出口,每条边有一个非负权值, 代表策策经 ...

  3. js angular 时间戳转换成日期格式 年月日 yyyy-MM-dd

    昨天写项目,要把时间戳转换成日期格式发给后端 我就去网上找 看到的一些都不是我想要的 索性自己就写了一个如图 下面是angular 模式 $scope.getMyDate = function(str ...

  4. android_app c++框架

    找遍了全网,没有一个完整的可用的框架.ndk自带的android_native_app_glue确实不太好用,闭关几天,写出了一个框架.完全的消息队列调用,目前测试的主体框架是没有什么问题了,程序入口 ...

  5. LOGO免费在线设计

    http://www.logomaker.com.cn/ 藏经阁技术资料分享群二维码

  6. linux 定义变量 ,添加变量值

    1.设置值$name=test2. 输出变量的值 echo $echo $name3. 增加变量内容PATH=$PATH:/home/bin/testPATH="$PATH":/h ...

  7. python自动化测试学习笔记-8多线程

    线程模块 python的多线程只能利用cpu的一个核心,一个核心同时只能运行一个任务那么为什么你使用多线程的时候,它的确是比单线程快答:如果是一个计算为主的程序(专业一点称为CPU密集型程序),这一点 ...

  8. C#结构体+结构体与类的区别

    C# 结构(Struct) 在 C# 中,结构是值类型数据结构.它使得一个单一变量可以存储各种数据类型的相关数据.struct 关键字用于创建结构. C# 结构的特点 您已经用了一个简单的名为 Boo ...

  9. js作用域、异步——学习笔记

    所有的 for if switch while do 等等,都属于块级作用域,里面声明的对象,外面也能访问.但function 函数里的作用域,在函数外是访问不到的. 但函数作用域里面可以访问外面. ...

  10. Tomcat无法clean,无法remove部署的项目

    错误: 对部署在Tomcat下的项目进行clean操作,总是提示Could not load the Tomcat server configuration,错误信息如图: 解决: 原来是将Serve ...