HDU 3920 Clear All of Them I(狀態壓縮)
阿新 • • 發佈:2018-11-08
https://blog.csdn.net/lxglbk/article/details/6674270
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define MAXN 1111111 #define INF 0x3fffffff struct Point { double x, y; } node[22]; int n; double status[MAXN]; double dist(Point a, Point b) { return sqrt((a.x-b.x)*(a.x-b.x) +(a.y-b.y)*(a.y-b.y)); } bool nodecmp(const Point a, const Point b) { return dist(node[0], a) < dist(node[0], b); } double min(double x, double y) { return x < y ? x : y; } double dfs(int sta, int cnum) { if(status[sta] != -1) return status[sta]; if(cnum == n)//幹掉了n對人 return 0; int pos = -1; int temp = sta; status[sta] = INF; for(int c = 1; temp; temp >>= 1, c++) { if(temp & 1) { if(pos == -1)//確定第一點 pos = c; else//到了第二點 status[sta] = min(status[sta], dfs(sta-(1<<(pos-1))-(1<<(c-1)), cnum+1) + dist(node[0], node[pos]) + dist(node[pos], node[c])); } } return status[sta]; } int main() { freopen("data.in", "r", stdin); int t, casenum; int i, upper; scanf("%d", &t); for(casenum = 1; casenum <= t; casenum++) { scanf("%lf %lf", &node[0].x, &node[0].y); scanf("%d", &n); upper = n<<1; for(i = 1; i <= upper; i++) { scanf("%lf %lf", &node[i].x, &node[i].y); } sort(node+1, node+1+upper, nodecmp); memset(status, -1, sizeof(status)); double ans = dfs((1<<upper)-1, 0);//倒推 關鍵 避免超時 printf("Case #%d: %.2lf\n",casenum, ans); } return 0; }