博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1433 DP 状态压缩
阅读量:4588 次
发布时间:2019-06-09

本文共 1302 字,大约阅读时间需要 4 分钟。

题目描述

房间里放着n块奶酪。一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处。

输入输出格式

输入格式:

 

第一行一个数n (n<=15)

接下来每行2个实数,表示第i块奶酪的坐标。

两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

 

输出格式:

 

一个数,表示要跑的最少距离,保留2位小数。

 

输入输出样例

输入样例#1:
41 11 -1-1 1-1 -1
输出样例#1:
7.41

 

这题开始用搜索做的,稍微剪下枝就能水过去,不过时间用的比较多,后来用 DP 做了一遍。

用二进制表示一个集合,比如  1011 表示一个包含了 0,1,3 结点的集合。

dp[i][j] 表示,在 i 集合中,以 j 结点作为起始点走完集合中所有点的最短路径。

dp[i][j] = min(dp[k][x] + len[j][x])

k 是去掉 j 结点的集合,x 是 k 中的任意一点, len[j][x] 表示 j 到 x 的距离。

 

代码:

#include 
#include
#include
using namespace std;const int MAX = 17;const int INF = 0x3fffffff;double dp[1<
0){ //如果 i 结合有第 j 个结点 int k = i - t; //k 集合等于 i 集合去掉 j 结点// if(i == 3){// cout << k << endl;// } for(int x=0; x<=n; x++){ t = (1<
0){ //如果 k 集合里有第 x 个结点 //dp[k][x] + len[x][j] : 从 j 点出发到 x 点的距离再加上从 x 出发走完 k 集合的最短距离 dp[i][j] = min(dp[i][j], dp[k][x] + len[j][x]); } } } } } ans = dp[((1<<(n+1))-1)][0]; printf("%.2lf", ans); return 0;}

 

转载于:https://www.cnblogs.com/lighter-blog/p/7352682.html

你可能感兴趣的文章
nginx动静分离小示例
查看>>
nginx socket转发设置
查看>>
centos samba搭建
查看>>
Android Studio 错误: 非法字符: '\ufeff'
查看>>
并发编程--一堆锁,GIL,同步异步,Event事件
查看>>
svn配置
查看>>
解决SQLite database is locked
查看>>
Javascript中this关键字
查看>>
微信静默授权
查看>>
Spring MVC框架初步讲解
查看>>
关于dl dt dd 文字过长换行在移动端显示对齐的探讨总结
查看>>
C#线程安全打开/保存文件对话框
查看>>
201555334 实验一:Java开发环境的熟悉 总结
查看>>
docker系列 --- 命令详解
查看>>
观察者模式 -- 设计模式系列文章(二)
查看>>
MySql学习14-----数据备份和恢复
查看>>
页面小标签
查看>>
卷积分
查看>>
Asp.Net MVC Filter权限过滤使用说明
查看>>
一次群体code review
查看>>