最低工资proglem

时间:2016-01-25 17:39:52

标签: dynamic-programming brute-force minimize

我们有n个学生。对于每个第i个学生,我们都知道它的数学(m i )和编码技巧(c i )。我们希望每个学生都有一位老师。但是,只有教师在数学和编码方面具有相同或更好的技能,教师才能教学生。每位教师都可以教尽尽可能多的学生。 数学技能M和编码C的老师获得C * M薪水。问题是尽量减少所有教师的整体薪水 示例:
4
1 6
4 2
2 2
2 5
输出:20 因为我们可以得到(2,6)和(4,2),所以我们需要支付2 * 6 + 4 * 2 = 20
我发现最简单的方法就是蛮力c和m的所有可能值(有一些限制)并最小化c * m。但是这个问题来自动态编程部分。那么任何人都可以提出如何更有效地解决它的想法吗?

1 个答案:

答案 0 :(得分:1)

第1步,清理数据:

  1. 删除受支配的学生。 (如果c_x> = c_y且m_x> = m_y,则x支配y)
  2. 按c_i排序。所以我们有c_1< c_2 ...< c_n,并不是很难推断m_1> m_2 ...> m_n(theorem 1
  3. 第2步,计算:

    f(i) = the minimal salary for teaching student 1..i
    

    在此之前,我们定义:

    s(i,j) = the salary of employing only one teacher to teaching student i..j(i < j)
    s(i,j) = max(c_(i..j)) * max(m_(i..j))
    s(i,j) = c_j * m_i (by theorem 1)
    

    所以我们可以得到:

    f(i) = min(f(j) + s(j+1,i)) j >= 1 and j < i
    

    通过简单的实现,我们可以在O(n ^ 2)中计算f(n)(答案)。

    欢迎在此提出任何问题,我会尽快回复。