P1387 + P1736原魚最大二乗法(DP +前処理矩形の)

最大の広場

1  // 最大フルマトリックス01を発見正方形、および出力側の長さ
2の#include <入出力ストリーム>
 。3の#include <cstdioを>
 4の#include <cstdlib>
 5の#include <cmath>
 6の#include <CStringの>
 7の#include <アルゴリズム>
 8の#include <cmath>
 9  の#define LLロングロング
 10  使って 名前空間STD;
 11  INT MP [ 109 ] [ 109 ];
 12である INT F [ 109 ] [ 109 ];
 13である 整数M、N-;
 14  
15  INTmain()の
 16  {
 17      CIN >> N >> M。
18      のためにINT iは= 1 ; iが<= N; I ++ 19      {
 20          のためにINT J = 1 ; J <= Mであり、j ++ 21          {
 22              CIN >> MP [I] [J]。
23          }
 24      }
 25      のint RES = 0 26      のためにINTは iは= 1 ; I <= N; I ++ 27      {
 28          のInt J = 1。 ; J <= M; J ++ 29          {
 30              IF (MPは、[I]は[J])
 31である                  F [I] [J] =最小(MIN(F [I- 1 ] [J]、F [I]、[J- 1 ])、F [I- 1 ] [J- 1 ])+ 1 ; // それが三の方向(最小から選択される一つである場合、そうでなければ、意図するタイトルを満たしていない可能性があります)
32              
33である                  ; F [I] [J] MP = [I] [J] //は0を埋めることである
34がある              RES = 、MAX(F [I]、[J]、RES)
 35          }
 36      }
 37 [      COUT << RES。
 38      リターン 0;
39 }

クリエイティブ魚の法則

1台の // 類似P1387最大正方形
 2  // 磁石01を使用すると、正方行列最大部、出力側の長さを見つけるせている
3。の#include <入出力ストリーム>
 4。の#include <CStringの>
 5。 使用した 名前空間STDを、
 図6  のconst  int型 = N 3000 ;
 7  BOOL MP [N] [N];
 8  INT S1 [N] [N]、S2 [N] [N]; // S1が横0、S2の数を表し、縦ゼロの数を示している
9。 INT F [N] [N]; // の四角辺の長さ
10  INTメイン(ボイド11  {
 12は      :: STD :: IOSのsync_with_stdio(falseに)。
13      整数N、M。
14      CIN >> N >> M。
15      のためにINT iは= 1 ; iが<= N; I ++ 16      {
 17          のためにINT J = 1 ; J <= Mであり、j ++ 18          {
 19              CIN >> MP [I] [J]。
20          }
 21      }
 22      // 左上到右下
23      のmemset(S1、0はsizeof (S1))。
24      のmemset(S2、0はsizeof (S2))。
25     memsetの(F、0はsizeof (F))。
26      INT ANS = 0 27      のためにINT iが= 1 ; iが<= N; I ++ 28      {
 29          のためにINT J = 1 ; J <= Mであり、j ++ 30          {
 31              であれば(MP [I] [J] == 0 32              {
 33の                  S1 [i]は[J] = S1 [i]は[J- 1 ] + 1 34                  S2 [i]は[J] = S2 [I- 1 ] [J] + 1;
35              }
 36              他の
37              {
 38                  F [I] [J] =分(F [I- 1 ] [J- 1 ]、分(S1 [i]は[J- 1 ]、S2 [I- 1 ] [J] ))+ 1 39の                  ANS = MAX(ANS、F [i]は[J])。
40              }
 41          }
 42      }
 43      // 右上到左下
44      のmemset(S1、0はsizeof (S1))。
45      のmemset(S2、0はsizeof (S2))。
46     memsetの(F、0はsizeof (F));
 47      のためにINT I =は1。 ; I <; I ++ = N- 48      {
 49          のためにINT J = M; J> = 1 ; J、 50          {
 51は、             IF(MP [I] [J] == 0 52であり             、{
 53は                  S1 [I] [J] = S1 [I]、[J + 1 ] + 1 ; // こことき、上から下へ、右横左に追加されるべきであることに留意
54                  S2 [I] [J] = S2 [I- 1 ] [J] + 1 ;
 55             }
 56              他の
57              {
 58                  F [I] [J] =分(F [I- 1 ] [J + 1 ]、分(S1 [i]は[J + 1 ]、S2 [I- 1 ] [J]))+ 1 ;
59の                  ANS = MAX(ANS、F [i]は[J])。
60              }
 61          }
 62      }
 63      COUT << ANS << ENDL。
64      リターン 0 ;
65 }

 

おすすめ

転載: www.cnblogs.com/greenofyu/p/12236157.html