dp專題 複製書稿

2021-08-13 16:39:35 字數 1331 閱讀 3022

複製書稿

題目描述

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

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

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

輸入第一行兩個整數m,k;(k≤m≤500)

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

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

樣例輸入

9 3

1 2 3 4 5 6 7 8 9

樣例輸出

1 5

6 7

8 9這道題目和之前做的最大乘積有點相似,都是在乙個範圍內分別斷開,然後取出最大(最小)值,不過這題需要多次比較,還需要輸出其路徑,特別是路徑讓我弄了半天;

#include

intsum[505][505];

int dp[505][505];

int a[505];

int x,y;

int max;

void print(int i,int j)//i=10,j=4

ti=i;

x=a[i];

while(x+a[ti-1]<=max)//從我們求最大值的方式可以看出,最後乙個人肯定是等於抄書最多的乙個人的,

//所以,我們只需要從最後乙個乙個加,只要小於最大值的都給乙個人抄,或許這不是當時賦值的時候的分配,

//但是乙個人只要抄的多餘他自己抄的而且又小於最大值那就讓他抄好了,只有這樣才會使前面的人抄的更少,

//如果按照當時分配的方式抄,雖然最大值沒有變,但是前面的人並不能抄的更少,他們的狀態都是為了讓最大值

//更小的狀態,而不是為了自己所抄的更少的狀態;

print(ti-1,j-1);

printf("%d %d\n",ti,i);

}int main()

for(int i=1;i<=x;i++)

dp[0][i]=sum[1][i];//只有乙個人的話就是他自己最大

}for(int i=1;ifor(int j=i+1;j<=x;j++)

else

if(dp[i][j]>qq)//把現在這個長度的最大值和之前的狀態比較,取小的最為新的狀態

}}

}max=dp[y-1][x];//賦最大值;

print(x,y);//輸出

return

0;}

DP 複製書稿 book

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

複製書稿 book 區間DP 貪心

複製書稿 book 時間限制 1 sec 記憶體限制 128 mb 題目描述 現在要把m本有順序的書分給k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間...

複製書稿 book (二分,貪心 dp)

時間限制 1 sec 記憶體限制 128 mb 提交 3 解決 1 提交 狀態 討論版 命題人 quanxing 現在要把m本有順序的書分給k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫...