[問題の説明]
ルルは、IQテストを設計しました。n行n列の行列のための試験。各行列は、上のグリッドがある
番号を。あなたは、サブ行列とみなさIQパスの最も美しいを見つける必要があります。
それは最も美しく、最も美しい度です。私たちは、この行列の主対角線図形の美しさのために行列を定義し、減算
対角線と他の数字の合計に。対角線の左上から右下への主対角線。
[入力形式
N-正の整数の第一の入力線(2 <= N - <= 400)
。
次のN * N行列であり、行列1000 -1000のデジタル数です。
出力フォーマット] [
美しい部分行列の全ての最大値を表す整数。
入力
2
1〜2
4
出力
4
入力
3
1 2 3
4 5 6
7 8 9
出力
0
入力
3
-3 4 5
7 9 -2
1 0 -6
出力
5
データ、N≤100の50%。
データの100%、400≤2≤Nです。
プレフィックスと最適化
N ^ 3
#include <iostreamの> する#include <cstdioを> の#define MAX(a、b)はA> B?A:B の#define Rレジスタ の#define MAXN 400 + 5 使用して 名前空間STD。 #defineは長い長いっ LL N。 LLのMP [ 405 ] [ 405 ]、S1 [ 405 ] [ 405 ]、S2 [ 405 ] [ 405 ]。 INT メイン() { freopenは(" matrix.in "、" R " 、STDIN)。 freopenは(" matrix.out "、" W " 、STDOUT)。 cinを >> N; 以下のための(R用のint i = 1 ; iは= N <; I ++ ) のための(R INT J = 1 ; J <= nであり、j ++ ) { CIN >> MP [I] [J]。 S1 [i]は[J] = S1 [I- 1 ] [J- 1 ] + MP [I] [J]。 S2 [i]は[J] = S2 [I- 1 ] [J + 1 ] + MP [I] [J]。 } INT ANS = 0 。 以下のための(R int型 I =1 ; iが<= N; I ++ ) のための(R INT J = 1 ; J <= N; J ++ ) のための(R INT K = 1 ; K + iが<= N && J + K <= nであり、k ++ ) ANS = MAX( ANS、S1 [I + K] [J + K] -S1 [I- 1 ] [J- 1 ] -S2 [I + K] [J] + S2 [I- 1 ] [J + K + 1 ])。 coutの << ANS << てendl; リターン 0 ; }