[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 ...
随机推荐
- C基础-对malloc的使用与理解
一.malloc函数分析 1.函数原型 void * malloc(size_t size); 2.Function(功能) Allocates a block of size bytes of m ...
- ACM_排序
除了sort,你还会什么 Time Limit: 1000/500ms (Java/Others) Problem Description: 给出若干人的年龄(1~100之间的整数),把它们按照从小到 ...
- 转】 mysql5.6.12 for Linux安装
原博文出自于: http://blog.csdn.net/book_mmicky/article/details/25714049 感谢! 1:上www.mysql.org下载64位版本mysql5. ...
- jQuery学习笔记(2)-选择器的使用
一.选择器是什么 有了jQuery的选择器,我们几乎可以获取页面上任意一个或一组对象 二.Dom对象和jQuery包装集 1.Dom对象 JavaScript中获取Dom对象的方式 <div i ...
- C#学习-EF在三层中使用
1.搭建普通三层 DAL层,BLL层,Model层,Web层: DAL层引用Model层 BLL层引用DAL层和Model层 Web层引用BLL层和Model层 2.实现EF三层的搭建(添加引用,修改 ...
- linux环境mxnet 安装
环境ubuntu 16.04 1.安装依赖项: sudo update && sudo apt-get install -y build-essential git libatlas- ...
- 文档声明和HTML样式表
文档声明 不是注释也不是元素,总是在HTML的第一行 书写格式:<!DOCTYPE HTML> 是用于通知浏览器目前文档正使用哪一个HTML版本(相关属性 lang) 若不写文档声明,浏览 ...
- Redis 注册为 widows 服务
redis-server.exe --service-install redis.windows.conf --loglevel verbose
- VMWare 支持的网络连接类型 (VMWare Virtual Network Connection Types)
- HDU_1203_01背包
I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...