使用动态编程实现最大化

时间:2012-11-23 20:34:55

标签: algorithm optimization dynamic-programming

我正在努力想出一个类似于以下问题的解决方案:

  • 设M是n行和T列的矩阵。
  • 让每一行都有正的非递减值。 (例如,行= [1,2,30,30,35])
  • 让M [i] [j]对应于在考试i上花费j个单位时间所获得的分数。

使用动态编程,解决问题,找到花费T单位时间学习的最佳方式,这将获得最高的总分。

提前感谢您的任何帮助:)

我的尝试:

S[][] = 0

for i = 1:n
   for j = 0:T
       max = 0
       for k = 0:j
           Grade = G[i][j]+ S[i-1][T-k]
           if Grade > max
              max = Grade
       end for
       S[i][j] = max
    end for
end for

2 个答案:

答案 0 :(得分:10)

S[i][j]代表您在第一次j考试中花费i个单位时间的最佳分数。您可以通过S[i][j]查看S[i-1][k]的每个值来计算k。对于S的每个元素,请记住上一行中k的值,该值会产生最佳结果。及时研究所有考试的最佳分数T的答案仅为S[n][T],您可以使用您记得的k的值来确定每个考试花费的时间考试。

S[][] = 0

for j = 0:T
   S[0][j] = M[0][j]

for i = 1:n
   for j = 0:T
       max = 0
       for k = 0:j
           # This is the score you could get by spending j time, spending
           # k time on this exam and j-k time on the previous exams.
           Grade = S[i-1][j-k] + M[i][k]
           if Grade > max
              max = Grade
       end for
       S[i][j] = max
    end for
end for

答案 1 :(得分:2)

我认为你问题中的G和G你的意思是一样的,如果你没有花任何时间考试,你得到0分。

在这种情况下,我会将DP矩阵定义为D [i,t] =通过在0到i的考试子集上花费t个总时间单位来实现的最佳分数。

W.l.o.g。你可以假设矩阵的第一列是全0。

在这种情况下,您可以观察到D满足以下重复:

  • D [0,t] = M [0,t]
  • D [i,t] = max_ {0< = k< = t}(M [i,k] + D [i-1,t-k])

这是您应用动态编程所需的内容