回文文字列を形成することができる少なくとも数文字を埋めるために求めて、文字列を与えた後、私たちは限り非対称ニーズの残りの部分は埋めるよう(右側アップ= len-ので左に、右に左を埋める、真ん中の最も多数を見つける見つけますサブ中間同じ)、それを減らす、サブストリングの中央を求めた方が良いので。
文字列:LEN = s1.size();
チャー:LEN = STRLEN()。
初めから入力:scanf関数( "%sの"、S1 + 1)。
添字から数え:INT LEN = STRLEN(S1 + 1)。
それは回文文字列があるので、ほぼ同じ、あなたは上下逆さまにそれを見つけることができますし、それが直接、最大の共通部分列です。
しかし、S1 [i]を== S2 [j]は、その後の後継+1を指示することができたときに、
として
Adb3bdmzA
Azmdb3bdA
Aのほとんどのエッジが満たされていません、
最長共通部分列は次のとおりです。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 int型のn、[ 1000008 ]は、B [ 10000008 F]、[ 10008 ] [ 10008 ]。 INT メイン(){ scanf関数(" %のD "、&N) 以下のために(int型私= 1 ; iが<= N; iが++ ) のscanf(" %dの"、および[I])。 以下のために(int型 i = 1 ; iが<= N; iは++ ) scanf関数を(" %のD "、&B [I])。 以下のために(int型 i = 1 ; iは= N <I ++ ) のための(INT J = 1 ; J <= nであり、j ++ ){ 場合([I- 1 ] == B [J- 1 ])F [i]が[J] = MAX(F [I] [J]、F [I- 1 ] [J- 1 ] + 1 )。 他 F [I] [J] = MAX([I-F 1 ] [J]、F [i]は[J- 1 ])。 } INT ANS = F [N] [N]。 printf(" %dの" 、ANS)。 リターン 0 ; }
次のようにタイトルとコードは次のとおりです。
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> 使用して 名前空間はstd; チャー S1〜[ 1009 ]、S2 [ 1009 ]。 INT F [ 1009 ] [ 1009 ]、MAXN。 INT メイン(){ scanf関数(" %sの"、S1 + 1 )。 INT LEN = STRLEN(S1 + 1 )。 以下のために(int型 i = 1 ; iは= LEN <; iは++ ) S2 [lenの -i + 1 ] = S1 [i]は、 以下のための(int型 i = 1 ; iが= LEN <; Iは++ ){ ため(INT J = 1 ; J <= LENあり、j ++ ){ 場合(S1 [i]が== S2 [J]) [I] [j]をfは =最大(F [I] [J]、F [I- 1 ] [J- 1 ] + 1 )。 他 F [I] [J] = MAX([I-F 1 ] [J]、F [i]は[J- 1 ])。 // MAXN = MAX(MAXN、F [i]は[J])。 } } のprintf(" %dの"、len- F [LEN] [LEN])。 リターン 0 ; }
私は、高速学習する必要はありません黄色のタイトル戦を行い、状態遷移方程式はまだ記載されていません。