最長の増加連続サブシーケンスII

(行サイズn、カラムサイズMで)あなたの整数行列を与え、このマトリックス中に最長の増加連続サブシーケンスを見つけます。(ここでは最長の増加連続サブシーケンスの定義は、任意の行または列で始まり、アップ/ダウン/右に行くことができます/任意の方向を左)。

行列を考えます:

[
  [1 ,2 ,3 ,4 ,5],
  [16,17,24,23,6],
  [15,18,25,22,7],
  [14,19,20,21,8],
  [13,12,11,10,9]
]

リターン 25

Lintcode上の質問は、この質問は、要件が連続増分シーケンス内の2次元行列で、非常に興味深いです。これは、四方マトリックス可能で連続しています。マトリックスの例として、円の周り外輪です。最長は、サブシーケンスと同様の増加します。私たちは、ここで[i] [j]は私に最長の連続増分シーケンスの長さであり、jはエンディングであるDP DPとして定義された状態。

再帰関係を導出することができる:DP [I] [J] =最大{DP [I-1]〜[J] +1([II] [J] <[I] [J])、DP [Iを] [J-1] +1([I]、[J-1] <[I] [J])、DP [I + 1] [J] +1([I + 1]〜[J] < 4つの方向に再帰的である[I] [J])、DP [I]、[J + 1] +1([I]、[J + 1] <[I] [J]) 。

初期DP [I] [J] = 1、すなわち、現在の文字。

最終状態MAX(DP [I] [J])。DPので[I] [j]は最長増加サブシーケンス特定端位置の長さを規定します。行列、M×n個の要素の合計が、これらの要素は、トラバースされことができます。複雑さは、初期の長さは、プレーすることは困難であるが、DPを使用して行列が行列を訪問し、最長の長さが1である、ここでも可能であるため、問題ではO(n ^ 2)です。また、我々は、フラグ行列を設定する必要があります。

コードは以下の通りであります:

クラスソリューション:
     #1 @param {INT [] []} A整数行列
    #1 @return {INT}整数
    DEF longestIncreasingContinuousSubsequenceII(自己、A):
         もし ない A または しない[0]:
             リターン0 
        N = LEN( )
        M = LEN(A [0])
        フラグ = [偽] * M  I はxrange(N)] 
        DP = [1] * M  I はxrange(N)] 
        MAXVAL = 1
          I xrange(N)
             のための J はxrange(M):
                MAXVAL = MAX(MAXVAL、self.search(A、フラグ、DP、I、J))
         を返すMAXVALを
     DEF (自己、A、フラグ、DP、Xを検索し、Y ):
         もしフラグ[X] [Y]:
             戻りDP [X] [Y] 
        DX = [0、0、-1、1 ] 
        DY = [1、-1 、0、0] 
        
        のための I はxrange(4 ) :
             もし 0 <= X + DX [I] <LEN(A)及び 0 <= Y + 1 DY [I] <LEN([0]) A [X] [Y]> A [X + DX [I ] [Y + DYの[I]:
                DP [X] [Y] = MAX(DP [X] [Y]、self.search(A、フラグ、DP、X + DX [i]は、Y + 1 DY [I])+ 1 
        フラグ[X] [ y]は = 戻り DPを[X] [Y]

 

 

ます。https://www.cnblogs.com/sherylwang/p/5616824.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34219944/article/details/94525981