package com.interview.books.leetcode; import com.interview.utils.ArrayUtil; import com.interview.utils.ConsoleWriter; /** * Created_By: stefanie * Date: 14-12-11 * Time: 上午9:27 */ public class LCS4_FairPainter { //time[i][k] is the min time paint walls from i using K painter. //initialize: time[i][1] = sum(walls[walls.length - 1] - walls[i] //function: time[i][k] = min(for j > i and j < walls.length: max(sum(walls[i][j], time[j+1][k-1]) //result: time[0][K] //Time: O(KN^2) Space: O(KN) public int minTime(int[] walls, int K) { if (walls.length == 0) return 0; int[][] time = new int[walls.length][K + 1]; //init int sum = 0; for (int i = walls.length - 1; i >= 0; i--) { sum += walls[i]; time[i][1] = sum; } //function for (int k = 2; k <= K; k++) { for (int i = 0; i < walls.length; i++) { sum = 0; time[i][k] = Integer.MAX_VALUE; for (int j = i; j < walls.length; j++) { sum += walls[j]; int cost = sum; if (j < walls.length - 1) cost = Math.max(cost, time[j + 1][k - 1]); time[i][k] = Math.min(time[i][k], cost); } } } ConsoleWriter.printIntArray(time); //result return time[0][K]; } public static void main(String[] args){ LCS4_FairPainter painter = new LCS4_FairPainter(); int[] walls = new int[]{1,2,4,5,6,3,1,2,7,8,2,5}; System.out.println(ArrayUtil.sum(walls, 0, walls.length - 1)); System.out.println(painter.minTime(walls, 4)); } }