UVA - 10911 Forming Quiz Teams
2015-06-08 19:23
507 查看
题目大意:有 2 * n 个点,使其组成 n 对,求 n 对点集的最小距离之和.
解题思路:由于 2 * n 最大才 20,完全可以由数字的位来表示,每一个数字表示一个状态,然后才去记忆化搜索的方式得出结果。
解题思路:由于 2 * n 最大才 20,完全可以由数字的位来表示,每一个数字表示一个状态,然后才去记忆化搜索的方式得出结果。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; int N; double DP[1 << 17], dis[20][20]; double cal(int x, int y) { return sqrt(x * x + y * y); } double DPS(int S) { if (DP[S] || !S) return DP[S]; int i; for (i = N - 1; i >= 0; i--) if (S & (1 << i)) break; DP[S] = 0x3f3f3f3f; for (int j = i - 1; j >= 0; j--) if (S & (1 << j)) DP[S] = min(DP[S], dis[i][j] + DPS(S ^ (1 << i) ^ (1 << j))); return DP[S]; } int main() { int x[20], y[20], kase = 0; while (scanf("%d", &N), N) { N <<= 1; for (int i = 0; i < N; i++) scanf("%*s%d%d", &x[i], &y[i]); for (int i = 0; i < N; i++) for (int j = i + 1; j < N; j++) dis[j][i] = cal(x[i] - x[j], y[i] - y[j]); memset(DP, 0, sizeof(DP)); printf("Case %d: %.2lf\n", ++kase, DPS((1 << N) - 1)); } return 0; }
相关文章推荐
- 对于GUI监听按钮里面去调另一个方法时的错误
- 7款Android开发者常用的Android UI组件
- UInavigationcontroller中栈的概念和模态视图的切换
- GuozhongCrawler系列教程 (2) CrawTaskBuilder详解
- UILabel实现文本自适应方法(ios7)
- 关于Tableview头部添加图片或者其他东西的时候
- iOS 在UILabel显示不同的字体和颜色(转)
- private static final long serialVersionUID
- Azure在Build大会北京站
- 错误3:this class is not key value coding-compliant for the key Mylabelss
- Android charsequence
- String StringBuffer StringBuilder之间的区别
- easyui datagrid
- 【Android UI】RadioGroup+Fragment实现底部菜单栏
- IOS8 viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionC
- 系统UIAlertView与代码弹出的区别
- Mosquito的优化——其他优化(九)
- Mosquito的优化——订阅树优化(八)
- Mosquito的优化——epoll优化(七)
- UEditor用法