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、はsizeof(0 ))。 以下のために(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])。 } }