您的位置:首页 > 其它

书稿复制(动态规划)

2016-04-08 21:48 232 查看
Description  假设有M本书(编号为1,2,…M),想将每本复制一份,M本书的页数可能不同(分别是P1,P2,…PM)。  将这M本书分给K个抄写员(K<=M〉,每本书只能分配给一个抄写员进行复制,而每个抄写员所分配到的书必须是连续顺序的。试找一个最优分配方案,使分配给每一个抄写员的页数的最大值尽可能小(如存在多个最优方案,只输出其中一种)。
Input文件的第一行是两个整数m和k
(1<=k<=m<=500)。第二行有m个整数P1,P2,…,Pm,这m个整数均为正整数且都不超过1000000。每两个整数之间用空格分开。Output文件有k行,每行有两个正整数。整数之间用空格分开。第I行的两个整数ai和bi,表示第I号抄写员所分配得到的书稿的起始编号与终止编号。Sample
Input
9 3
1 2 3 4 5 6 7 8 9
Sample
Output
1 5
6 7
8 9



解题思路:

f[k,m]表示前m本书交给k个人抄写需要的最短时间,状态转移方程为:

f[k,m]=min{max{f[k-1,i],∑Tj},i=1,2,…,m-1}

然后再用贪心求出具体的分配方案。

时间复杂度:O(k*m^2)



程序:

varx,y,i,j,m,n,k,t,l:longint;a,d:array[0..500]of longint;f:array[0..500,0..500]of longint;function max(x,y:longint):longint;beginif x>y
then exit(x);exit(y);end;procedure print(i,j:longint);vart,x:longint;beginif j=0 then
exit;if j=1 then
begin writeln(1,' ',i); exit; end;t:=i;x:=a[i];while
x+a[t-1]<=f[k,m] dobeginx:=x+a[t-1];dec(t);end;print(t-1,j-1);writeln(t,'
',i);end;beginreadln(m,k);fillchar(f,sizeof(f),$7f);for j:=1 to m dobeginread(a[j]);d[j]:=d[j-1]+a[j];f[1,j]:=d[j];end;for i:=2 to k dofor j:=1 to
m dofor l:=1 to j-1 doif max(f[i-1,l],d[j]-d[l])print(m,k);end.版权属于: Chris原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102vjru.html转载时必须以链接形式注明原始出处及本声明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: