#include <stdio.h> #include <string.h> #define TWO_TO_THE_21 2097152 #define MAX_TO_SELECT 20 int tree_height, cut_limit, tree[TWO_TO_THE_21], T[TWO_TO_THE_21][MAX_TO_SELECT + 1], oo; bool calculated[TWO_TO_THE_21][MAX_TO_SELECT + 1]; void readInPreOrder(int index, int depth) { scanf("%d", &tree[index]); if (depth < tree_height) { readInPreOrder(index * 2 + 1, depth + 1); readInPreOrder(index * 2 + 2, depth + 1); } } int dp(int node, int depth, int to_select) { if (depth == tree_height) { return tree[node]; } if (calculated[node][to_select]) return T[node][to_select]; int best_sol = tree[node]; for (int i = 1; i < to_select; i++) { int sub_sol = dp(node * 2 + 1, depth + 1, i) + dp(node * 2 + 2, depth + 1, to_select - i); if (sub_sol > best_sol) best_sol = sub_sol; } T[node][to_select] = best_sol; calculated[node][to_select] = true; return best_sol; } int main() { scanf("%d", &tree_height); while (tree_height != -1) { scanf("%d", &cut_limit); readInPreOrder(0, 0); memset(calculated, false, sizeof(calculated)); oo = T[0][0]; int sol = dp(0, 0, cut_limit); printf("%d\n", sol); scanf("%d", &tree_height); } return 0; }
Thursday, April 23, 2015
UVa 11782 - Optimal Cut
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment