TopCoder SRM 667 Div1 Easy: OrderOfOperations
解法
各bitを頂点,各bit間の遷移を辺としてダイクストラする.
コード
import java.util.Arrays; import java.util.PriorityQueue; public class OrderOfOperations { public int minTime(String[] s) { int N = s.length; int M = s[0].length(); int[] operations = new int[N]; for (int i = 0; i < N; i++) { operations[i] = Integer.parseInt(s[i], 2); } int[] cost = new int[1 << M]; Arrays.fill(cost, Integer.MAX_VALUE / 100); cost[0] = 0; PriorityQueue<Edge> queue = new PriorityQueue<>(); queue.add(new Edge(0, 0)); while (!queue.isEmpty()) { Edge edge = queue.poll(); for (int i = 0; i < N; i++) { int next = operations[i] | edge.bit; int k = Integer.bitCount(next ^ edge.bit); int c = k * k; if (cost[next] > cost[edge.bit] + c) { cost[next] = cost[edge.bit] + c; queue.add(new Edge(next, cost[next])); } } } int goal = 0; for (int i = 0; i < N; i++) { goal = goal | operations[i]; } return cost[goal]; } } class Edge implements Comparable<Edge> { int bit, cost; public Edge(int bit, int cost) { this.bit = bit; this.cost = cost; } @Override public int compareTo(Edge o) { return this.cost - o.cost; } }