Submission #618491


Source Code Expand

using System;
using System.Collections.Generic;
using System.Linq;

class Program {
    static string ReadLine() { return Console.ReadLine(); }
    static int ReadInt() { return int.Parse(ReadLine()); }
    static int[] ReadInts() { return ReadLine().Split().Select(int.Parse).ToArray(); }
    static string[] ReadStrings() { return ReadLine().Split(); }

    static int[,] Rotate(int[,] g) {
        int rows = g.GetLength(0);
        int cols = g.GetLength(1);
        var t = new int[cols, rows];
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                t[j, rows-i-1] = g[i, j];
            }
        }
        return t;
    }

    static long Calc(int[,] g) {
        int rows = g.GetLength(0);
        int cols = g.GetLength(1);

        // 縦方向の和を求める
        var sum = new long[rows, cols];
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                sum[i, j] = g[i, j];
                if (i > 0) sum[i, j] += sum[i-1, j];
            }
        }

        // row i から row j までの範囲に対して、部分列の最大和を求める
        var maxRow = new long[rows, rows]; // maxRow[i, j] 行 i から行 j までの範囲の矩形の最大和
        for (int i = 0; i < rows; i++)
            for (int j = 0; j < rows; j++)
                maxRow[i, j] = long.MinValue;

        var dp = new long[cols];
        for (int i = 0; i < rows; i++) {
            for (int j = i; j < rows; j++) {
                long max = long.MinValue;
                for (int k = 0; k < cols; k++) {
                    long x = sum[j, k] - (i > 0 ? sum[i-1, k] : 0);

                    if (k == 0) dp[k] = x;
                    else dp[k] = Math.Max(dp[k-1] + x, x);

                    max = Math.Max(max, dp[k]);
                }
                maxRow[i, j] = max;
            }
        }

        // 領域を二つに分割して、それぞれ最大和を求める
        long ans = long.MinValue;
        for (int i = 0; i < rows-1; i++) { // i までが top の領域
            long topMax = long.MinValue;
            long btmMax = long.MinValue;
            for (int j = 0; j < rows; j++) { // 行 j から行 k までの矩形
                for (int k = j; k < rows; k++) {
                    if (k <= i) topMax = Math.Max(topMax, maxRow[j, k]);
                    else if (j > i) btmMax = Math.Max(btmMax, maxRow[j, k]);
                }
            }

            ans = Math.Max(ans, topMax + btmMax);
        }
        return ans;
    }

    static void Main() {
        var hw = ReadInts();
        int rows = hw[0], cols = hw[1];

        var g = new int[rows, cols];
        for (int i = 0; i < rows; i++) {
            var xs = ReadInts();
            for (int j = 0; j < cols; j++) {
                g[i, j] = xs[j];
            }
        }

        var ans = Math.Max(Calc(g), Calc(Rotate(g)));
        Console.WriteLine(ans);
    }
}

Submission Info

Submission Time
Task D - 庭園
User noriok
Language C# (Mono 3.2.1.0)
Score 100
Code Size 3067 Byte
Status AC
Exec Time 691 ms
Memory 16796 KB

Judge Result

Set Name Sample Subtask1 All
Score / Max Score 0 / 0 50 / 50 50 / 50
Status
AC × 4
AC × 15
AC × 30
Set Name Test Cases
Sample sample0.txt, sample1.txt, sample2.txt, sample3.txt
Subtask1 subtask0_0.txt, subtask0_1.txt, subtask0_10.txt, subtask0_11.txt, subtask0_12.txt, subtask0_13.txt, subtask0_14.txt, subtask0_2.txt, subtask0_3.txt, subtask0_4.txt, subtask0_5.txt, subtask0_6.txt, subtask0_7.txt, subtask0_8.txt, subtask0_9.txt
All subtask0_0.txt, subtask0_1.txt, subtask0_10.txt, subtask0_11.txt, subtask0_12.txt, subtask0_13.txt, subtask0_14.txt, subtask0_2.txt, subtask0_3.txt, subtask0_4.txt, subtask0_5.txt, subtask0_6.txt, subtask0_7.txt, subtask0_8.txt, subtask0_9.txt, subtask1_0.txt, subtask1_1.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_2.txt, subtask1_3.txt, subtask1_4.txt, subtask1_5.txt, subtask1_6.txt, subtask1_7.txt, subtask1_8.txt, subtask1_9.txt
Case Name Status Exec Time Memory
sample0.txt AC 127 ms 9628 KB
sample1.txt AC 127 ms 9716 KB
sample2.txt AC 128 ms 9632 KB
sample3.txt AC 129 ms 9752 KB
subtask0_0.txt AC 149 ms 10048 KB
subtask0_1.txt AC 136 ms 10032 KB
subtask0_10.txt AC 133 ms 10076 KB
subtask0_11.txt AC 131 ms 9940 KB
subtask0_12.txt AC 132 ms 10032 KB
subtask0_13.txt AC 132 ms 9916 KB
subtask0_14.txt AC 131 ms 9908 KB
subtask0_2.txt AC 130 ms 9988 KB
subtask0_3.txt AC 134 ms 9908 KB
subtask0_4.txt AC 131 ms 9908 KB
subtask0_5.txt AC 132 ms 10044 KB
subtask0_6.txt AC 132 ms 10028 KB
subtask0_7.txt AC 135 ms 9908 KB
subtask0_8.txt AC 129 ms 9952 KB
subtask0_9.txt AC 128 ms 9912 KB
subtask1_0.txt AC 571 ms 16320 KB
subtask1_1.txt AC 633 ms 16636 KB
subtask1_10.txt AC 542 ms 16144 KB
subtask1_11.txt AC 691 ms 16768 KB
subtask1_12.txt AC 616 ms 16380 KB
subtask1_13.txt AC 691 ms 16796 KB
subtask1_14.txt AC 575 ms 16284 KB
subtask1_2.txt AC 683 ms 16752 KB
subtask1_3.txt AC 565 ms 16272 KB
subtask1_4.txt AC 592 ms 16416 KB
subtask1_5.txt AC 660 ms 16668 KB
subtask1_6.txt AC 624 ms 16456 KB
subtask1_7.txt AC 599 ms 16380 KB
subtask1_8.txt AC 681 ms 16788 KB
subtask1_9.txt AC 597 ms 16404 KB