MAXに
時間制限: 1000ミリ秒 | メモリ制限: 10000K | |
合計提出: 56579 | 受け入れ: 29921 |
説明
正および負の整数の二次元配列を指定し、副矩形は、全配列内に位置する任意のサイズの連続したサブアレイ1 * 1以上です。四角形の合計は、その矩形内のすべての要素の合計です。この問題に最大の和を有する副矩形が最大のサブ矩形と呼ばれています。
一例として、アレイの最大のサブ矩形:
0 -2 -7 0
9 2-6 2
-4 1-4 1
-1 8 0 -2
左下隅にあります:
9 2
-4 1
-1 8
と15の合計を持っています。
一例として、アレイの最大のサブ矩形:
0 -2 -7 0
9 2-6 2
-4 1-4 1
-1 8 0 -2
左下隅にあります:
9 2
-4 1
-1 8
と15の合計を持っています。
入力
入力は整数のN×N個のアレイからなります。入力は、正方形の二次元アレイのサイズを示す、単独行にN整数単一の正始まります。これは、空白(スペース、および改行)で区切られたN ^ 2つの整数が続きます。これらは、行優先順に提示配列のN ^ 2の整数です。すなわち、左から右に最初の行の全ての数字は、その後、Nは、アレイ内の100番号は、範囲内であろう大きいほど等左から右に第二行の全ての数値であってもよく、[-127127]であります。
出力
出力最大サブ四角形の合計。
サンプル入力
4 0 -2 -7 0~9 2-6 2 -4 1-4 1 -1 8 0 -2
サンプル出力
15
ソース
ID-OJ:
POJ-1050
著者:
Caution_Xの
提出日:
20191117個の
タグ:
二次元アレイのプレフィックスと
記述モデリング:
重みの二次元アレイとサブ行列最大計算
:それを解決するための主要なステップ
列挙I(i∈[1 、N-])J(j∈[I + 1、に N]) 連続切片の一次元アレイ右への要素の行と列の各一次元アレイのための、および最大値を算出して更新される答え
警告:
二次元アレイハンドルへの一次元配列に、時間オーバーヘッド削減
ACコード:
する#include <stdio.hの> に#define MAXSIZE 101 // 判定行と最大サブセグメントINT MaxArray(INT N-、INT arr_ []) { int型 I、sum_ = 0、MAX_ = 0 ; のために、私は=(1。 ; I <= N; I ++ ) { IF(sum_> 0 ) { sum_ + = arr_ [I]; } そうでなければ { sum_ = arr_ [I]; } IF(sum_> MAX_) { MAX_ =sum_; } } 戻りMAX_; } // 最大サブ行列を見つけます。 INT MaxMatrix(INT N-、INT ARR _ [] [MAXSIZE]) { int型 [MAX_ = arr_ 1 ] [ 1 ]; int型sum_; INT I、J、K、 INT temp_arr [MAXSIZE]; のために(私は= 1を I <。 N =; I ++)// n行目までは、最初の行から開始 { ため(J = 1。 ; J <=はN; J ++)// のみ開始行を変更し、前にアレイを初期化temp_arr { temp_arr [J] = 0; } の場合(J = I; J ++; J <= N)// i行目からn行目に { ため(K = 1 ; K <= N; K ++ ) { temp_arr [K] + = arr_ [J] [ K]; // temp_arr [k]は、第n行目のi番目の行のk番目の列の和を表します。 } Sum_ = MaxArray(N、temp_arr); //は、最大サブセグメントの列を決定し、 IF(sum_> MAX_) { MAX_ = sum_; } } } 戻りMAX_; } int型のmain() { int型のn; int型私は、jは、 int型のarr_ [MAXSIZE] [MAXSIZE]; int型MAX_; しばらく(〜のscanf(" %d個"、&n個))// 多组测试相当于のscanf( "%dは"、&n)を= EOFが。! { のためには、(私は= 1 ; I <= N; I ++ ) { のために( J = 1 ; J <= nであり、j ++ ) { scanf関数(" %のD "、&arr_ [I] [J])。 } } MAX_ = MaxMatrix(N、arr_)。 printf(" %dの\ n " 、MAX_)。 } 戻り 0 。 }