書稿複製(動態規劃)

2021-07-11 02:00:05 字數 1677 閱讀 6787

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 78 9

解題思路:
f[k,m]表示前m本書交給k個人抄寫需要的最短時間,狀態轉移方程為:
f[k,m]=min,i=1,2,…,m-1}
然後再用貪心求出具體的分配方案。
時間複雜度:o(k*m^2)
程式:
var

x,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;

begin

if x>y then exit(x);

exit(y);

end;

procedure print(i,j:longint);

vart,x:longint;

begin

if 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] do

begin

x:=x+a[t-1];

dec(t);

end;

print(t-1,j-1);

writeln(t,' ',i);

end;

begin

readln(m,k);

fillchar(f,sizeof(f),$7f);

for j:=1 to m do

begin

read(a[j]);

d[j]:=d[j-1]+a[j];

f[1,j]:=d[j];

end;

for i:=2 to k do

for j:=1 to m do

for l:=1 to j-1 do

if max(f[i-1,l],d[j]-d[l])

print(m,k);

end.

版權屬於: chris

複製書稿(動態規劃經典題)

problem description 現在要把m本有順序的書分給k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間最短。複製時間為抄寫頁數最多的人用去的...

dp專題 複製書稿

複製書稿 題目描述 現在要把m本有順序的書分給k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間最短。複製時間為抄寫頁數最多的人用去的時間。輸入第一行兩個...

DP 複製書稿 book

時間限制 1000 ms 記憶體限制 65536 kb 提交數 184 通過數 78 現在要把 m本有順序的書分給 k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,...