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

2021-08-06 07:22:52 字數 1715 閱讀 4609

problem description

現在要把m本有順序的書分給k個人複製(抄寫),每乙個人的抄寫速度都一樣,一本書不允許給兩個(或以上)的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第

一、第三和第四本書給同乙個人抄寫。

現在請你設計一種方案,使得複製時間最短。複製時間為抄寫頁數最多的人用去的時間。

input

輸入有多組資料,每組資料第1行兩個整數m,k(k<=m<=500);

第2行m個整數,第i個整數表示第i本書的頁數。

output

對於每組資料輸出k行,每行兩個整數,第i行表示第i個人抄寫的書的起始編號和終止編號。k行的起始編號應該從小到大排列,如果有多解,則盡可能讓前面的人少抄寫。

sample input

9 31 2 3 4 5 6 7 8 9

sample output

1 56 7

8 9hint

如果m=k=0,則輸出空行

解題思路:

最短時間為抄寫頁數最多的時間,所以要先求最多的抄寫頁數,從中選擇最小值 

1. 設狀態:f[i][j]//將前i本書分給j個人抄寫需要的最短時間;

2. 初始狀態:f[i][1];//乙個人抄寫前i本書需要的最短時間就是前i本書的頁數

最終狀態:f[m][k];//將前m本書分給j個人抄寫需要的最短時間

3. 狀態轉移方程:先分配最後乙個人抄寫的頁數,求得最大值 。max(f[i-l][j-1],d[i]-d[i-l]);

最後求最短時間 f[i][j]=min 

求具體方案:

在用動態規劃求得最優值後,然後用貪心的思想,將最後一本書按逆序將書分配給k個人抄寫,從第k個人開始,如果他還能寫,就給他,直到分配完畢。

/*

9 31 2 3 4 5 6 7 8 9*/

#includeusing namespace std;

int i,j,x,y,m,n,k,t,l;

int a[501];//儲存每本書的頁數

int f[501][501];//f[i][j]表示前i本書分給j個人抄寫的最短複製時間

int d[501];//d[j]表示前j本書的總頁數

int a[501];//a[i]表示第i本書的頁數

int f[501][501];//f[i][j]表示前j本書分給i個人抄寫需要的最短時間

int d[501];

int k,m,t,x,i,j,l;

int print(int i,int j)//輸出具體方案,i本書,j個人

} for(j=1;j<=m;j++)

for(i=2;i<=k;i++)

{ for(j=1;j<=m;j++)

{ for(l=1;l<=j-1;l++)

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

書稿複製(動態規劃)

description 假設有m本書 編號為1,2,m 想將每本複製乙份,m本書的頁數可能不同 分別是p1,p2,pm 將這m本書分給k個抄寫員 k m 每本書只能分配給乙個抄寫員進行複製,而每個抄寫員所分配到的書必須是連續順序的。試找乙個最優分配方案,使分配給每乙個抄寫員的頁數的最大值盡可能小 如...

動態規劃經典5題

dp一年多沒碰過了,今天突然想找找感覺,找了經典的幾道dp複習著敲了敲。雖然最大子矩陣,滑雪,石子合併等問題也足夠經典,我還是從中找了5道最經典的dp寫了這篇博文,如果您是大一,大二想踏入程式競賽的同學可以當習題做做,如果您像我一樣不是acmer,平時專案中也很少用dp,同樣可以回顧一下dp的奧妙。...

動態規劃經典五題

雖然最大子矩陣,滑雪,石子合併等問題也足夠經典,我還是從中找了5道最經典的dp寫了這篇博文。有n 件物品和乙個容量為 v的揹包。第 i件物品的費用是 c i 價值是 w i 求解將哪些物品裝入揹包可使價值總和最大。轉移方程 dp i j max dp i 1 j dp i 1 j weight i ...