我们有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。但是这个问题来自动态编程部分。那么任何人都可以提出如何更有效地解决它的想法吗?
答案 0 :(得分:1)
第1步,清理数据:
theorem 1
)第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)
(答案)。
欢迎在此提出任何问题,我会尽快回复。