Copy Books(书籍复印)

http://www.lintcode.com/en/problem/copy-books/?rand=true

public class Solution {
    /*
     * @param pages: an array of integers
     * @param k: An integer
     * @return: an integer
     */
    public int copyBooks(int[] pages, int k) {
        // write your code here
        int n = pages.length;
        if (n == 0) {
            return 0;
        }
        int[] sum = new int[n];
        sum[0] = pages[0];
        for (int i = 1; i < n; i++) {
            sum[i] = sum[i - 1] + pages[i];
        }
        int[][] dp = new int[n][k];
//        dp表示i本书,j个人的最小时间
        for (int i = 0; i < n; i++) {
            dp[i][0] = sum[i];
//            只有一个人时,总时间就是最小时间
            for (int j = 1; j < k; j++) {
                dp[i][j] = Integer.MAX_VALUE;
//                    l表示书本的数
                for (int l = i; l >= 0; l--) {
//                    i本书,j个人可以看作让最后一个人来复印最后的i - l本书,
//                    那么最小花费就是l本书 j-1个人的时间和一个人i-l的时间的大值。
                    dp[i][j] = Math.min(dp[i][j], Math.max(dp[l][j - 1], sum[i] - sum[l]));
                }
            }
        }
        return dp[n - 1][k - 1];
    }
}

你可能感兴趣的:(Copy Books(书籍复印))