合唱团问题:

  1. dp的大小为(k+1)*(n+1), k=0和n=0时元素的值都是0,也就是说规划过程中忽略第一行和第一列的所有元素。
  2. dp[k][one]代表选择第one个元素之后,再从one前面选出k-1个元素。
  3. 初始化规划数组时,dp[1][1…n]的值分别为a[1…n],因为k-1=0。
  4. 接下来的循环中,k从2开始,表示需要选k个人,这时候one就要从k开始循环,因为one位置的元素是要选中的。dp[k][one]的最优解就应该是a[one]*dp[k-1]left中的最大值。这样将dp数组从第1行到第k行,每一行再分别从第当前k值列到最后一列填充,第k行前k个值为0,没有在规划过程中被填充,而由max(k-1, one-d)保证了不会访问到上一行中没有被赋值的元素,这是因为在填第k行时对第k-1行的循环最少也是从k-1开始的。