给定 n 本书, 第 i 本书的页数为 pages[i]. 现在有 k 个人来复印这些书籍, 而每个人只能复印编号连续的一段的书, 比如一个人可以复印 pages[0], pages[1], pages[2], 但是不可以只复印 pages[0], pages[2], pages[3] 而不复印 pages[1].
所有人复印的速度是一样的, 复印一页需要花费一分钟, 并且所有人同时开始复印. 怎样分配这 k 个人的任务, 使得这 n 本书能够被尽快复印完?
返回完成复印任务最少需要的分钟数.
样例
样例 1:
输入: pages = [3, 2, 4], k = 2
输出: 5
解释: 第一个人复印前两本书, 耗时 5 分钟. 第二个人复印第三本书, 耗时 4 分钟.
样例 2:
输入: pages = [3, 2, 4], k = 3
输出: 4
解释: 三个人各复印一本书.
挑战
时间复杂度 O(nk)
public class Solution {
/**
* @param pages: an array of integers
* @param k: An integer
* @return: an integer
* f[k][i] 为 k个人最少时间搞定 i本书
*/
public int copyBooks(int[] pages, int k) {
// write your code here
int[][]dp = new int[k+1][pages.length+1];
for(int i=1;i<=pages.length;++i) {
dp[0][i]=Integer.MAX_VALUE;//0个人,i本书
}
int sum=0;
for(int i=1;i<=k;++i) {
//i个人 ,如何处理 n本书 ???
dp[i][0]=0;
for(int j=1;j<=pages.length;++j) {
dp[i][j]=Integer.MAX_VALUE;
sum=0;
for(int t=j;t>=0;--t) {
dp[i][j] = Math.min(dp[i][j],Math.max(dp[i-1][t],sum));
if(t>0) {
sum+=pages[t-1];
}
}
}
}
return dp[k][pages.length];
}
}
计算f[0][0], f[0][1], …, f[0][N]
• 计算f[1][0], f[1][1], …, f[1][N]
• …
• 计算f[K][0], f[K][1], …, f[K][N]
• 答案是f[K][N]