分析
バオが質問、私のコードの正しさに疑問、データ、あまりにも多くの水をカブス
各点は、最長下方プレコンディショニングの最長文字列の長さと文字列長と右行列の左上隅であります
そして、暴力列挙点は、軽く渡されるかを決定します
書式#include <iostreamの> の#include <cstdioを> 使用して 名前空間はstdを、 CONSTの INT N = 3E2 + 10 。 INTのN、M。 INT [N] [N]。 INTのpHを[N] [N]、PL [N] [N]、ANS。 文字列sの。 ブールB; INT メイン(){ scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型 I = 1、I ++; iは= N < ) のための(INT J = 1 ; J <= Mであり、j ++)のscanf(" %d個"、&[I] [J])。 以下のために(int型 i = 1 ; iが<= N; I ++ ) のための(INT J = 1 ; J <= Mであり、j ++ ){ int型の H = 0、L = 0 。 用(int型の k個++; <= M kはK = J ) のための(INT ; p <=(J + K)/ P = J 2 ; P ++ ) 場合!([I] [P] = [I] [ + J]-Pをk)を破ります。 他の 場合(P ==(J + K)/ 2)H = K-J + 1; 用(int型 K = I; K <= N; ++ k個) のための(int型 P = I; p <=(I + K)/ 2であり; p ++ ) 場合!([P] [J] = [K-P + I] [J])ブレーク。 他の 場合(Pの==は(iはK + 1)/ 2)L = K-I + 1 。 pH値[I] [J] = hの; PL [I] [j]は= L。 } のために(int型 i = 1 ; iがn = <; I ++ ) のための(INT J = 1 ; J <= Mであり、j ++ ){ int型MNA =分(PH [I]、[J]、PL [I] [J]); B = 1 。 以下のために(int型 ; kはK = iは<= iはmna- + 1 ; kは++ ) であれば(私は[K] [J]のpHを+ - 1 > = K)MNA = 分(MNA、pHは[K] [J])。 他{ B = 0 。 破ります; } のための(int型 K = J、K <= J + mna- 1 ; kは++ ) 場合(J + PL [i]は[K] - 1 > = K)MNA = 分(MNA、PL [i]は[K]) ; 他の{ B = 0 。 破ります; } もし、(B)ANS = MAX(ANS、MNA)。 } のprintf(" %dの" 、ANS)。 }