AOJ- 0098 Maximum Sum Sequence II Scala

Maximum Sum Sequence II Scala
部分行列の和の最大値 | Aizu Online Judge


何回も見たことのあるような問題。。。。。
まぁとりあえず、この問題の最初の考えは、
左上から右下までの総和を出す(各場所の)。

Sample Input

 3
 1 -2 3
 -4 5 6
 7 8 -9

で考える

1 -2 3 → 1 0 0 → 1 -1 0  → 1 -1 2  → 1 -1 2  → 1 -1 2  → 1 -1 2
-4 5 6 → 0 0 0  → 0 0 0   → 0 0 0   → -3 0 0  → -3 0 0  → -3 0 9
7 8 -9 → 0 0 0  → 0 0 0   → 0 0 0   →  0 0 0   → 0 0 0   → 0 0 0
                                                                  ↓↓↓
↓↓↓←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←
1 -1 2 → 1 -1 2  → 1 -1 2
-3 0 9 → -3 0 9 → -3 0 9
4 0 0 → 4 15 0 → 4 15 15                                     


計算 ... map   [ i - 1 ] [ j ]  +  [ i ] [ j - 1 ]   -  [ i - 1 ] [ j - 1 ]



次に
総和からその場から区切りの場所まで削る。
削る際に重なってる部分多く削るので、その部分を足す

計算... [最初での総和]  -  [区切りまでの削り]  -  [区切りまでの削り]  +  [削りの重なり]






ではソースコード!!!!

import scala.io.StdIn._
import scala.math._
object Main{
    def main(args: Array[String]): Unit = {
        lazy val n = readInt
        var map = Array.ofDim[Int](n + 1, n + 1)
        for(i <- 1 to n){
              var temp = readLine.split(" ").map(_.toInt)
            for(j <- 1 to n)map(i)(j) = map(i)(j - 1) + map(i - 1)(j) -  map(i - 1)(j - 1) + temp(j - 1)
        }
        var max = map(1)(1)
        for(i <- 1 to n ;j <- 1 to n;k <- i to n;l <- j to n) max = math.max(max,map(k)(l) + map(i - 1)(j - 1) - map(i - 1)(l) - map(k)(j - 1))   
        
        
        println(max)
  }
}