[luoguP1433] 吃奶酪(DP || Dfs)
深搜加剪纸可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)的更多相关文章
- 洛谷 P1433 吃奶酪【DFS】+剪枝
题目链接:https://www.luogu.org/problemnew/show/P1433 题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处 ...
- 洛谷P1433 吃奶酪【dfs】【剪枝】
题目:https://www.luogu.org/problemnew/show/P1433 题意: 给定n个坐标,要求从(0,0)开始走遍所有点,最少经过的路程. 思路: 刚开始想像数字三角形一样适 ...
- [状压DP]吃奶酪
吃 奶 酪 吃奶酪 吃奶酪 题目描述 房间里放着 n n n 块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 ( 0 , 0 ) (0,0) (0,0)点处. 输入 第一行有一个整 ...
- 解题报告:luogu P1433 吃奶酪
题目链接:P1433 吃奶酪 我感觉可以改成:[模板]TSP问题(商旅问题) 了. 爆搜\(T\)一个点,考虑状压\(dp\)(还是爆搜). 我们用\(dp[i][j]\)表示现在是\(i\)状态,站 ...
- 集训作业 洛谷P1433 吃奶酪
嗯?这题竟然是个绿题. 这个题真的不难,不要被他的难度吓到,我们只是不会计算2点之间的距离,他还给出了公式,这个就有点…… 我们直接套公式去求出需要的值,然后普通的搜索就可以了. 这个题我用的深搜,因 ...
- 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 ...
- 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
题目传送门 /* 记忆化搜索(DP+DFS):dp[i][j] 表示第i到第j个字符,最少要加多少个括号 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 当 ...
- HDU 4272 LianLianKan (状压DP+DFS)题解
思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...
- HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca
Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...
随机推荐
- 运行Android Studio总是未发现设备
1.未发现虚拟机设备
- weiphp插件开发注意
插件命名要规范,插件名文件名,控制器名,模型名要以大写开头.不然的话会有惊喜!╮(╯▽╰)╭
- Django day 34 过滤课程,登录,redis,python操作redis
一:过滤课程, 二:登录 三:redis, 四:python操作redis
- post和get区别,其他答案真的太坑
原理: get和post都是http定义与服务器交互的方法,还有put,delete url是网络上的资源,那么http中的get,post,put,delete对应的就是对这个资源的查,改,增,删四 ...
- [NOI2003]Editor
Description 很久很久以前,DOS3.x的程序员们开始对 EDLINEDLIN 感到厌倦. 于是,人们开始纷纷改用自己写的文本编辑器?? 多年之后,出于偶然的机会,小明找到了当时的一个编辑软 ...
- 257 Binary Tree Paths 二叉树的所有路径
给定一个二叉树,返回从根节点到叶节点的所有路径.例如,给定以下二叉树: 1 / \2 3 \ 5所有根到叶路径是:["1->2->5", " ...
- Code Kata:大整数四则运算—除法 javascript实现
除法不可用手工算法来计算,其基本思想是反复做减法,看从被除数里面最多能减去多少个除数,商就是多少. 除法函数: 如果前者绝对值小于后者直接返回零 做减法时,不需要一个一个减,可以以除数*10^n为基数 ...
- WEB-CSS实现单行(多行)文本溢出显示省略号
//单行文本溢出部分隐藏显示省略号...overflow: hidden; text-overflow:ellipsis; white-space: nowrap; /** n 行文本溢出部分隐藏显示 ...
- 61配置nanopim1plus的HDMI为1080p输出
61配置nanopim1plus的HDMI为1080p输出 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2018/4/4 10:21 版本:V1.1 开 ...
- Android集成微信分享功能应用签名生成方法及分享不生效的问题
通过友盟sdk集成微博.微信.qq等分享功能时,微博和qq很顺利,但在做微信集成时一直不成功.主要问题还是之前在微信开放平台申请创建移动应用时,对应用签名没有填写对,走了很多弯路现总结出来,加深记忆避 ...