【动态规划】复制书稿

来源:互联网 发布:centos的vmdk文件下载 编辑:程序博客网 时间:2024/05/01 03:48

【动态规划】复制书稿

Time Limit:1000MS Memory Limit:65536K

Description

有M本书(编号为1,2,…,M),每本书都有一个页数(分别是P1,P2,…,PM)。想将每本都复制一份。将这M本书分给K个抄写员(1<=K<=M<=500),每本书只能分配给一个抄写员进行复制。每个抄写员至少被分配到一本书,而且被分配到的书必须是连续顺序的。复制工作是同时开始进行的,并且每个抄写员复制一页书的速度都是一样的。所以,复制完所有书稿所需时间取决于分配得到最多工作的那个抄写员的复制时间。试找一个最优分配方案,使分配给每一个抄写员的页数的最大值尽可能小。 

Input

第一行两个整数M、K;(K<=M<=500) 
第二行M个整数,第i个整数表示第i本书的页数。

Output

输出为一个数,即分配给每一个抄写员的页数的最大值

Sample Input

9 31 2 3 4 5 6 7 8 9

Sample Output

17

Hint

样例说明: 
三个人抄书的位置分别为: 
1-5 (15页) 
6-7 (13页) 
8-9 (17页)


由于要求每位抄写员抄写的书必须是连续的,只要在M和K的循环内部再加一个k循环枚举上一位抄写员的结束位置即可。

#include <cstdio>
#include <algorithm>
#define INF 100000000
using namespace std;
int M,K,p[500+1];
int sum[500+1];//1~i页数和 
int dp[500+1][500+1];//dp[i][j]=抄写员1~i抄写1~j本书的MAX 
int main()
{
scanf("%d%d",&M,&K);
for(int i=1;i<=M;i++)scanf("%d",p+i),sum[i]=sum[i-1]+p[i];
for(int i=1;i<=K;i++)
   for(int j=i;j<=M;j++)//前i位抄写员至少抄写i本,因此令j=i开始循环 
   if(i==1)dp[i][j]=sum[j];
   else
   {
   dp[i][j]=INF;//初始化为INF 
   for(int k=i-1;k<=j-1;k++)//枚举第i-1位抄写员结束的位置 
       dp[i][j]=min(max(dp[i-1][k],sum[j]-sum[k]),dp[i][j]);
}
printf("%d",dp[K][M]);
return 0;
}

1 0
原创粉丝点击