羅区P1435の回文文字列

回文文字列を形成することができる少なくとも数文字を埋めるために求めて、文字列を与えた後、私たちは限り非対称ニーズの残りの部分は埋めるよう(右側アップ= 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 ;
} 

私は、高速学習する必要はありません黄色のタイトル戦を行い、状態遷移方程式はまだ記載されていません。

おすすめ

転載: www.cnblogs.com/jindui/p/11028560.html