Problem:
Problem C: Unhappy Class

Problem

山之御船学園の1年G組は、不幸を背負った女子生徒たちが集まるクラスである。 彼女たちは、幸福になることを目標に、日々様々な試練に立ち向かう。

彼女たちのクラスでは、幸福になるための試練の一環として、幸福実技科目を受講することができる。

月曜から金曜のそれぞれ1限からN限までに授業科目の枠があり、M個の受講可能な科目がある。

科目iは、曜日di(di = 0, 1, 2, 3, 4がそれぞれ、月曜、火曜、水曜、木曜、金曜に対応する)のai限目から始まり、連続するkiコマで行われ、それを受講したときに得られる幸福度はtiである。

各生徒は、最大L個の科目を互いに重ならないように自由に選ぶことができる。どのように科目を選べば、最も高い幸福度を得られるだろうか。与えられた科目の情報から、得られる幸福度の最大値を求めてほしい。

Input

入力は以下の形式で与えられる。

N M L
d1 a1 k1 t1
d2 a2 k2 t2
...
dM aM kM tM

1行目に3つの整数N, M, Lが空白区切りで与えられる。

2行目からM+1行目に4つの整数di, ai, ki, tiが空白区切りで与えられる。

Constraints

2 ≤ N ≤ 8

0 ≤ M ≤ 300

0 ≤ L ≤ min(N×5, M)

0 ≤ di ≤ 4

1 ≤ ai ≤ N

1 ≤ ki

ai + ki - 1 ≤ N

1 ≤ ti ≤ 100

Output

幸福度の和の最大値を1行に出力せよ。

Sample Input 1

3 7 3
0 1 1 1
0 1 1 2
1 1 3 4
1 1 1 1
1 2 1 2
2 1 1 3
2 2 2 1

Sample Output 1

9

Sample Input 2

5 10 5
0 1 1 2
0 2 1 2
0 1 2 3
1 2 1 2
1 4 2 3
2 1 1 1
2 1 1 2
3 3 2 3
4 1 1 2
4 2 1 2

Sample Output 2

13

Solution in Scala (judge verdict: Wrong Answer)

object Main extends App {

  import scala.io.StdIn._

  val Array(n, m, l) = readLine.trim.split(' ').map(_.toInt)
  val classes = List.tabulate(m){_ ⇒
    val Array(d, a, k, t) = readLine.trim.split(' ').map(_.toInt)
    new Class(d, a, k, t)
  }.sortBy(_.from)
  println(calMaxHappiness(classes, l))
  def calMaxHappiness(classes: List[Class], limit: Int): Int = {
    val memo = Array.tabulate(classes.length){_ ⇒ Array.tabulate(limit){_ ⇒ None: Option[Int]}}
    def sub(classes: List[Class], rest: Int, current: Int = 0): Int = {
      if (rest == 0) 0
      else {
        classes match {
          case Nil ⇒ 0
          case h::t ⇒
            memo(current)(rest - 1) match {
              case Some(r) ⇒ r
              case None ⇒
                val use = h.value + sub(t.dropWhile(_.from < h.until), rest - 1, current + 1)
                val unuse = sub(t, rest, current + 1)
                memo(current)(rest - 1) = Some(math.max(use, unuse))
                math.max(use, unuse)
            }
        }
      }
    }
    sub(classes, limit)
  }

  case class Time(day: Int, time: Int) extends Ordered[Time] {
    override def compare(that: Time): Int = if (day == that.day){
      time.compare(that.time)
    }else {
     day.compare(that.day)
    }
  }
  class Class(d: Int, a: Int, k: Int, t: Int){
    val day = d
    val from = Time(day, a)
    val until = Time(day, a + k)
    val value = t
  }
}