// UVa 11008 - Antimatter Ray Clearcutting #include <iostream> #include <stdio.h> #include <string.h> using namespace std; struct point { int x, y; }; int n, m, oo; int T[65536]; point tree[16]; int cross(point p0, point p1, point p2) { return (p1.x - p0.x) * (p2.y - p0.y) - (p1.y - p0.y) * (p2.x - p0.x); } int dp(int mask, int cut) { if (cut >= m) return 0; if (T[mask] == oo) { int best_sub = oo; for (int i = 0; i < n; i++) if ((mask >> i) & 1) { int new_mask = mask ^ (1 << i); best_sub = min(best_sub, dp(new_mask, cut + 1)); for (int j = i + 1; j < n; j++) { if ((mask >> j) & 1) { new_mask = mask ^ (1 << i) ^ (1 << j); int new_cut = cut + 2; for (int k = j + 1; k < n; k++) if (((mask >> k) & 1) && (cross(tree[i], tree[j], tree[k]) == 0)) { new_mask = new_mask ^ (1 << k); new_cut++; } best_sub = min(best_sub, dp(new_mask, new_cut)); } } } T[mask] = best_sub + 1; } return T[mask]; } int main() { int power[17]; power[0] = 1; for (int i = 1; i < 17; i++) power[i] = power[i - 1] << 1; int tt; cin >> tt; for (int t = 1; t <= tt; t++) { cin >> n >> m; for (int i = 0; i < n; i++) cin >> tree[i].x >> tree[i].y; // dp memset(T, 127, sizeof(T)); oo = T[0]; int sol = dp(power[n] - 1, 0); // output printf("Case #%d:\n%d\n", t, sol); if (t < tt) printf("\n"); } return 0; }
Friday, November 6, 2015
UVa 11008 - Antimatter Ray Clearcutting
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment