【累積和メニュー】> 【2 次元上のいもす法】STEP: 3 2 次元上のいもす法 3 (paizaランク C 相当) [難易度: 1414 ±51]
※リンク先へ移動するためには[paiza]へのログインが必要です。

1 行目に a_i, b_i, c_i, d_i (1 ≦ i ≦ 5) が 5 行で与えられます。
5 行 5 列のマスがあり、最初、マスには全て 0 が書かれています。
5 つの長方形領域の左上の座標 (a_i, b_i) と右下の座標 (c_i, d_i) が与えられます。それぞれの範囲に対して、その範囲に含まれるマスに 1 を加算していきます。
5 行 5 列のマスに書かれた値のうち、最大の値をいもす法を用いて求めてください。
入力値(例)
1 1 3 3
2 2 4 4
3 3 5 5
1 3 3 5
3 1 5 3
出力値(例)
5
解答例
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <?php     $sRow = array_fill(0, 6, 0);     $s = array_fill(0, 6, $sRow);     for ($i=0; $i<5; $i++) {         list($a, $b, $c, $d) = explode(" ", trim(fgets(STDIN)));         $x1[] = $a;         $y1[] = $b;         $x2[] = $c;         $y2[] = $d;         $s[$y1[$i]-1][$x1[$i]-1]++;         $s[$y2[$i]][$x2[$i]]++;         $s[$y1[$i]-1][$x2[$i]]--;         $s[$y2[$i]][$x1[$i]-1]--;     }     // 横方向への累積和     for ($i=0; $i<6; $i++) {         for ($j=1; $j<6; $j++) {             $s[$i][$j] += $s[$i][$j-1];         }     }     // 縦方向の累積和     for ($i=1; $i<6; $i++) {         for ($j=0; $j<6; $j++) {             $s[$i][$j] += $s[$i-1][$j];         }     }     //print_r($s);     // 最大値を調べる     $tile_max = 0;     for ($i=0; $i<6; $i++) {         for ($j=0; $j<6; $j++) {             if ($tile_max < $s[$i][$j]) {                 $tile_max = $s[$i][$j];             }         }     }     echo $tile_max; ?> | 

 
							
											

 
                