poj1159(ダイナミック・プログラミングまたはLCS最長の文字列を見つけます。)

 http://acm.hrbust.edu.cn/vj/index.php?c=problem-problem&id=20480

LCSは、最長共通部分文字列を要求します

する#include <stdio.hに> 
する#include <iostreamの> 
する#include <マップ> 
する#include < 文字列・H> 
の#include <ベクトル>
 使用して 名前空間STDを、
ショート A [ 5005 ] [ 5005 ]。
チャー S1 [ 5005 ]。
チャー S2 [ 5005 ]。
INT LCS(CONST  のchar * S1、CONST  のchar * S2)
{ 
    // S1:0 ... M、S2:0 ... N 
    INT M = STRLEN(S1)、N = STRLEN(S2)。
    int型私は、jは、
    [ 0 ] [ 0 ] = 0 ;
    以下のために(iは= 1 ; iが<= M; ++ I)
        [I] [ 0 ] = 0 ;
    ための式(I = 1 ; iが<= N; ++ I)
        [ 0 ] [I] = 0 ;
    以下のために(iは= 1 ; iが<= M; ++ I)
         のために(J = 1 ; J <= N; ++ j)は
        { 
            場合(S1 [I- 1 ] == S2 [J- 1 ])
                [ I] [J] = [I- 1] [J =  1] + 1 他の 場合([I- 1 ] [J]> [I]、[J- 1 ])
                [I] [J] = [I- 1 ] [J]。
            
                [I] [j]は = [I]、[J- 1 ]。
        } 
    戻り[n]は[m]を。
} 

int型のmain()
{ 
    int型のn;
    一方、(〜のscanf(" %d個"、&N))
    { 
        memsetの(S1、0はsizeof (S1))。
        memsetの(S2、0はsizeof(S2))。
        以下のためにINT iが= 0、I <N; I ++ 
        { 
            CIN >> S1 [i]は、
        } 
        ためINT iは= 0、n iは<; I ++ 
        { 
            S2 [i]は = S1 [NI- 1 ]。
        } 
        // coutの<< S1 <<」「<< S2 <<てendl; 
        COUT << N-LCS(S1、S2)<< ENDL。
    } 
}

動的プログラミング・ノート短いタイプ、またはメモリを超えます。

書式#include <stdio.hに> 
する#include <iostreamの> 
書式#include < 文字列の.h> 
の#include <math.h>の
 使用して 名前空間はstdを、
短い DP [ 5001 ] [ 5001 ]。
INT のmain()
{ 
    int型K。
    チャー [ 5001 ]、B [ 5001 ]。
    一方、(〜のscanf(" %dの"、&K))
    { 
        scanf関数(" %S " );
        int型のp = 0 ;
        ためにINT I = K- 1、I> = 0 ; i-- 
        { 
            B [P] = [I]。
            P ++ ; 
        } 
        // (INT I = 0、I <K; I ++)のための
            // のprintf( "%C%C"、B [i]は、(I ==(K-1)) '\ N'?」 ' ); 
        memsetの(DP、0はsizeof0 ))。
        以下のためにINT iが= 1 ; I <= K; I ++ のためのINT J = 1 ; J <= K; J ++ 
            { 
                もし([I] == B [J])DP [I] [J] = DP [I- 1 ] [J- 1 ] + 1 
                    DP [I] [J] = MAX(DP [I- 1 ] [j]は、DP [I]、[J- 1 ])。
            } 
           // のprintf( "%D \ n"は、DP [K] [K])。
        printf(" %dの\ n "、K- DP [K] [K])。

    } 
}

おすすめ

転載: www.cnblogs.com/RainzzZ/p/12067054.html