动态编程:翻译大量书籍的最低价格

时间:2012-05-31 12:33:48

标签: algorithm

我们有N本书(N<=200)。所有这些都必须由K人翻译(K<=100)。 每个人都可以翻译从索引S开始的D书到索引S + D-1,0 <= D <= N. 对于他翻译的第一本书,每个人每页的报酬为c_1,c_2为第二本...

c_i for the book i.
0<=c_i<10000

书籍必须按照给出的顺序翻译。

输入:
第一行:2个数字N和K
第二行:N个数字 - 每本书的页数(&lt; = 10 000)
第三行:N个数字 - c_1,c_2,... c_N; c_i是翻译i-1书籍的人翻译书籍的价格;

输出:
翻译所有书籍必须支付的最低价格。

例:
输入:
6 3
50 100 60 5 6 30
1 2 3 4 5 6

输出:339
(第一个人翻译了第一本书+ 50 * 1 第二个人翻译了第二,第三,第四和第五本书: + 100 * 1 + 60 * 2 + 5×3 + 6 * 4 第三个人翻译了最后一本书 + 30 * 1 = 339)
有人可以帮我做这个功课吗?我知道我必须使用动态编程来解决它。

2 个答案:

答案 0 :(得分:1)

一些线索:创建一个函数F(BookNumber,ManNumber,NumOfBooksHeHaveTranslated)。

以F(1,1,0)开头。很明显

F(1, 1, 0) = Pages[1] * C[1] + Min(F(2, 1, 1), F(2, 2, 0)) 

即。我们必须选择最好的变体 - 继续使用相同的翻译器,或使用下一个。为常见情况F(B,M,N)详细说明此函数,进行递归求解,检查小输入,将递归转换为DP(方法在算法书中描述)

答案 1 :(得分:0)

您的算法需要做的实际选择是您从一个翻译器到下一个翻译器的书籍序列中的哪些点。这是问题的唯一决定点,其他一切都来自它。您可以通过观察例如将其转换为递归/动态编程问题。 K翻译人员翻译N本书的费用相当于一名译员翻译x本书的费用和其余K-1翻译人员翻译N-x的费用;或者,相当于由n个翻译者翻译x个第一本书和由剩余的K-n翻译者翻译N - x的费用。这是一个细分/递归步骤,您可以在动态编程解决方案中使用它。

我希望没有人会发布实际代码来执行此操作;这是作业。