uva10911(集合DP)
2014-12-21 19:49
260 查看
题目的的意思就是给出n 然后给出2 * n个点.两两分成n组,距离和最小.
集合上的动态规划模板题:用状态压缩表示所有状态下,的最优解.
AC代码:
集合上的动态规划模板题:用状态压缩表示所有状态下,的最优解.
AC代码:
#include<stdio.h> #include<string.h> #include<math.h> const int INF = 0x3f3f3f3f; const int N = 20; const int M = 1 << 20; char name[25]; struct point{ double x; double y; }p ; double f[M]; double dis ; int n; double cul(point a , point b) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) ); } int main () { int cas = 1; while(scanf("%d",&n) && n != 0) { n = n * 2; for (int i = 0 ; i < n ;i++) { scanf("%s",name); scanf("%lf%lf",&p[i].x , &p[i].y); } for(int i = 0 ; i < n ;i++) { for(int j = 0 ; j <= i ;j++) { dis[i][j] = dis[j][i] = cul(p[i] , p[j]) ; } } f[0] = 0; for (int s = 1 ;s < (1 << n) ;s++) { int i , j ; f[s] = INF; for(i = 0 ; i < n ;i++) { if(s & (1 << i)) break; } for (j = i + 1 ; j < n ;j++) { if(s & (1 << j)) { f[s] = f[s] < dis[i][j] + f[s ^ (1 << i) ^ (1 << j)] ? f[s] : dis[i][j] + f[s ^ (1 << i) ^ (1 << j)]; } } } printf("Case %d: %.2lf\n",cas++ ,f[(1 << n) - 1]); } }
相关文章推荐
- uva10911 - Forming Quiz Teams 集合DP
- UVA1099----Sharing Chocolate----在集合上的DP
- UVA 10911 Forming Quiz Teams(dp + 集合最优配对问题)
- UVA 11825 集合枚举 状态压缩 dp
- uva 11825 黑客的攻击 Hackers' Crackdown 集合dp+我的优化 非常好的好题
- uva - 11825(高效枚举集合dp)
- uva 11795洛克人的难题(集合dp)
- UVA 10911 Forming Quiz Teams(状压DP)
- UVa 11795 - Mega Man's Mission (集合DP 状态压缩)
- Forming Quiz Teams - UVa 10911 状压dp
- UVALive 7721 K - 2-ME Set 集合dp,所有数的位或来表示状态。
- UVA1099----Sharing Chocolate----在集合上的DP
- UVa 11825 集合dp
- UVA11795——Mega Mans Missions(集合DP,状态压缩)
- 集合上的动态规划---最优配对问题(推荐:*****) // uva 10911
- 集合上的动态规划---最优配对问题(推荐:*****) // uva 10911
- UVa 10911 Forming Quiz Teams / 状态压缩DP
- uva_10911 - Forming Quiz Teams ( 状态压缩DP )
- UVA 10911 Forming Quiz Teams(状态压缩DP)
- UVa 10911 Forming Quiz Teams(状态压缩DP)