437. 书籍复印

437. 书籍复印

题目

描述
给定 n 本书, 第 i 本书的页数为 pages[i]. 现在有 k 个人来复印这些书籍, 而每个人只能复印编号连续的一段的书, 比如一个人可以复印 pages[0], pages[1], pages[2], 但是不可以只复印 pages[0], pages[2], pages[3] 而不复印 pages[1].

所有人复印的速度是一样的, 复印一页需要花费一分钟, 并且所有人同时开始复印. 怎样分配这 k 个人的任务, 使得这 n 本书能够被尽快复印完?

返回完成复印任务最少需要的分钟数.

来源:https://www.lintcode.com/problem/copy-books/description

思路

在这里插入图片描述

代码

        public static int copyBooks(int[] pages, int k) {
        // write your code here
        int n = pages.length;
        if(n==0){
            return 0;
        }
        int[][] f = new int[k+1][n+1];
        int[] S = new int[n];
        S[0] =  pages[0];
        for(int i=1;i<n;i++){
            S[i] = S[i-1]+pages[i];
        }
        for(int i=1;i<=k;i++){
            for(int j=0;j<=n;j++){
                if(j==0){
                    f[i][j] = 0;
                }else if(j==1){
                    f[i][j] = pages[j-1];
                }else{
                    if(i==1){
                        f[i][j] = S[j-1];
                    }else{
                        int m = Integer.MAX_VALUE;
                        for(int l=1;l<=j;l++){
                            int t = Math.max(f[i-1][l-1],S[j-1]-S[l-1]+pages[l-1]);
                            m = m>t?t:m;
                        }
                        f[i][j] = m;
                    }

                }
            }
        }
        return f[k][n];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值