package Order300; import java.util.HashMap; import BaseNode.TreeNode; public class T337_house_robber_iii { public static void main(String[] args) { TreeNode root = new TreeNode(); root .setVal(4) .setLeft(TreeNode.from(1).setLeft(TreeNode.from(2))) .setRight(TreeNode.from(0).setLeft(TreeNode.from(3))); System.out.printf("%d ", new Solution_me_梦中get终极算法().rob(root)); System.out.printf("%d ", new Solution_other().rob(root)); System.out.printf("%d ", new Solution_me_最优子结构递归().rob(root)); System.out.printf("%d ", new Solution_me_最优子结构记忆化().rob(root)); System.out.printf("%d ", new Solution_me_终极算法().rob(root)); System.out.println(); root = TreeNode .from(3) .setLeft(TreeNode.from(2).setRight(TreeNode.from(3))) .setRight(TreeNode.from(3).setRight(TreeNode.from(1))); System.out.printf("%d ", new Solution_me_梦中get终极算法().rob(root)); System.out.printf("%d ", new Solution_other().rob(root)); System.out.printf("%d ", new Solution_me_最优子结构递归().rob(root)); System.out.printf("%d ", new Solution_me_最优子结构记忆化().rob(root)); System.out.printf("%d ", new Solution_me_终极算法().rob(root)); System.out.println(); root = TreeNode .from(3) .setLeft( TreeNode.from(4).setLeft(TreeNode.from(1)).setRight(TreeNode.from(3)) ) .setRight(TreeNode.from(5).setRight(TreeNode.from(1))); System.out.printf("%d ", new Solution_me_梦中get终极算法().rob(root)); System.out.printf("%d ", new Solution_other().rob(root)); System.out.printf("%d ", new Solution_me_最优子结构递归().rob(root)); System.out.printf("%d ", new Solution_me_最优子结构记忆化().rob(root)); System.out.printf("%d ", new Solution_me_终极算法().rob(root)); System.out.println(); } static class Solution_me_梦中get终极算法 { public int rob(TreeNode root) { if (root == null) { return 0; } return Math.max(robSubTree(root, true), robSubTree(root, false)); } private int robSubTree(TreeNode root, boolean isRootSelected) { if (root == null) throw new RuntimeException( "robSubTree's root shouldn't be NULL !!!" ); if (isRootSelected) { return ( root.val + (root.left == null ? 0 : robSubTree(root.left, !isRootSelected)) + (root.right == null ? 0 : robSubTree(root.right, !isRootSelected)) ); } else { return ( (root.left == null ? 0 : robSubTree(root.left, !isRootSelected)) + (root.right == null ? 0 : robSubTree(root.right, !isRootSelected)) ); } } } static class Solution_me_最优子结构递归 { private int val(TreeNode node) { return (node == null) ? 0 : node.val; } private TreeNode getSon(TreeNode node, String who) { return (node == null) ? null : ("left".equals(who) ? node.left : node.right); } public int rob(TreeNode root) { if (root == null) { return 0; } int get_5 = val(root) + rob(getSon(getSon(root, "left"), "right")) + rob(getSon(getSon(root, "left"), "left")) + rob(getSon(getSon(root, "right"), "left")) + rob(getSon(getSon(root, "right"), "right")); int get_2 = rob(getSon(root, "left")) + rob(getSon(root, "right")); return Math.max(get_5, get_2); } } static class Solution_me_最优子结构记忆化 { private int val(TreeNode node) { return (node == null) ? 0 : node.val; } private TreeNode getSon(TreeNode node, String who) { return (node == null) ? null : ("left".equals(who) ? node.left : node.right); } public int rob(TreeNode root) { return memorizedRob(root, new HashMap<TreeNode, Integer>()); } private int memorizedRob( TreeNode root, HashMap<TreeNode, Integer> dpTable ) { if (root == null) { return 0; } if (dpTable.containsKey(root)) { return dpTable.get(root); } int lr = memorizedRob(getSon(getSon(root, "left"), "right"), dpTable); int ll = memorizedRob(getSon(getSon(root, "left"), "left"), dpTable); int rl = memorizedRob(getSon(getSon(root, "right"), "left"), dpTable); int rr = memorizedRob(getSon(getSon(root, "right"), "right"), dpTable); int get_5 = val(root) + lr + ll + rl + rr; int get_2 = memorizedRob(getSon(root, "left"), dpTable) + memorizedRob(getSon(root, "right"), dpTable); int robRoot = Math.max(get_5, get_2); dpTable.put(root, robRoot); return robRoot; } } static class Solution_me_终极算法 { public int rob(TreeNode root) { int[] result = rubAll(root); return Math.max(result[0], result[1]); } private int[] rubAll(TreeNode root) { if (root == null) { return new int[2]; } int[] left = rubAll(root.left); int[] right = rubAll(root.right); return new int[] { root.val + left[1] + right[1], Math.max(left[0], left[1]) + Math.max(right[0], right[1]), }; } } static class Solution_other { public int rob(TreeNode root) { int[] result = robInternal(root); return Math.max(result[0], result[1]); } public int[] robInternal(TreeNode root) { if (root == null) return new int[2]; int[] result = new int[2]; int[] left = robInternal(root.left); int[] right = robInternal(root.right); result[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]); result[1] = left[0] + right[0] + root.val; return result; } } }
|