书籍复印 dp解法

给定 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]
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值