(行サイズ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で再現