二解 書的複製

2021-08-02 08:11:16 字數 1221 閱讀 3907

題目詳見:

本題有兩種解法:

一.動態規劃

類似於乘積最大那道題,關鍵是劃分好書的分配方式,因為書本抄寫是連續的,因此該問題是滿足無後效性的,我們可以以抄書的人數為階段,dp[i][j]表示前i個人抄寫j本書需要抄寫所消耗的最少時間.

動態規劃轉移方程為:dp[i][j] = min(dp[i][j],max(dp[i-1][k],s[j] - s[k]));其中1 <= k < j,s陣列是字首和, s[i]代表從1至i本書的頁數和.

具體實現見**:

#include#include#include#includeusing namespace std;

int n,m;

int book[505],s[505];

int dp[505][505]; //dp[i][j]代表前j本書由i個人複製的最優值

int ans[505][3]; //ans[i][1]用來存第i個人複製書稿的起點,ans[i][2]用來存第i個人複製書稿的終點。

void cal(int x)

ans[j][1] = k+1;

end = k;

}}int main()

for(int i = 2; i<= m; i++)}}

cal(dp[m][n]);

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

return 0;

}

#includeusing namespace std;

int n,m;

int book[505],s[505],ans[505][3],le,ri;

int pd(int x)

ans[k][1] = i+1;

k--;

}if( i > 0)

return false;

else

return true;

}void calans(int x)

ans[k][1] = i+1;

k--;

}}int main()

le = 0;ri = s[n] +1;

while(le+1 < ri)

else

le = mid;

}calans(ri) ;

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

return 0;

}

書的複製 normal DP

time limit 1000ms memory limit 65536k total submit 164 accepted 83 description 現在要把m mm本有順序的書分給k kk個人複製 抄寫 每個人的抄寫速度都一樣,一本書不允許分給兩個或兩個以上的人抄寫,分給每個人的書,必須是...

書的複製 題解

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

書的複製(抄書問題)

現在要把 m 本有順序的書分給 k 給人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三 第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間最短。輸出共 k 行,每行兩個整數,第 i 行表示第 i 個人抄寫的書...