先說下題意吧,題面給的題意我都看不懂:
有\(n\)本書,每本書有乙個頁數%a_i%。每個人能寫連續的幾本書,他們寫書的速度可以認為是1頁1天。求讓\(k\)個人抄完這\(n\)本書的最短時間。
ps:\(k\)個人抄書的時間是其中抄的最慢的人用的時間。
dp的狀態非常容易想:dp[i][j]
表示前\(i\)本書,用\(j\)個人抄的最短時間。
那麼顯然可以列舉乙個小於\(i\)的\(j\)來更新狀態,這個方程式很水就不講了。
重點在於輸出方案。
得到的最短時間,根據題意,我們要讓後面的人盡可能的抄更多的書。
做法很簡單,從後面開始遞迴,列舉出最大的一段滿足的區間供給那個人抄,然後剩下的區間就給剩下的人抄。
**:
#include#include#includeconst int maxn = 505;
int dp[maxn][maxn];
int a[maxn], b[maxn];
int n, m;
void print(int maxv, int pos)
i++;
print(maxv, i - 1);
printf("%d %d\n", i, pos);
}int main()
for(int i = 1; i <= n; i++) dp[i][1] = b[i];
/*for(int k = 2; k <= m; k++)}}
*/for(int i = 2; i <= n; i++)}}
//printf("%d\n", dp[n][m]);
print(dp[n][m], n);
return 0;
}
P1281 書的複製 DP
原題鏈結 和之前的統計單詞個數十分類似 將前面的分為兩部分 一部分是前面的人抄的 剩下的是自己抄的 取max 和原時間取min include include include include include include include include include include includ...
P1281 書的複製 dp
紀念一下,這是我自己第乙個自己想出轉移方程的dp題!先定義一下陣列,f i j 表示第i個人,抄了j本書花的最短時間。w i j 表示 i,j 閉區間內,從第i本書抄到第j本書用的時間 轉移方程 f h i min f h i max f h 1 j w j 1 i 1 i m,1 j i 1 求出...
洛谷P1281 書的複製
大多數人的錯誤原因 盡可能讓前面的人少抄寫,如果前幾個人可以不寫則不寫,對應的人輸出0 0。不過,已經修改資料,保證每個人都有活可幹。現在要把m本有順序的書分給k給人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三 第...