効果の件名:
最小文字挿入、元の文字列が回文配列になるようにということ。
ソリューション:
LCSの問題、文字列を逆にし、ストリング多分LCS要求、全長(入力の複数のセット)を減算LCSします。
Nが最大5E3であり、直接二次元アレイは、超メモリです。そうするために使用する列をスクロール。
コード:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONST INT N = 5E3 + 7 。 INT DP [ 2 ] [N]。 チャーS1 [N]、S2 [N]。 int型のmain(){ int型、nは イオス:: sync_with_stdio(0 ); 一方、(CIN >> N){ memsetの(DP、0、はsizeof DP)。 CIN >> S1 + 1 ; 以下のために(INT iが= 1 ; I <= N; I ++)S2 [I] = S1 [i]は、 逆(S1 + 1、S1 + 1 + N)。 以下のために(INT iが= 1 ; I <= N; I ++ ) のための(INT J = 1 ; J <= nであり、j ++ ){ 場合(S1 [i]が== S2 [J])DP [I%2 ] [J = MAX(DP [I%2 ] [J]、DP [(I- 1)%2 ] [J- 1 ] + 1 )。 他 DP [I%2 ] [J] = MAX(DP [(I- 1)%2 ] [J]、DP [I%2 ] [J- 1 ])。 } coutの<< N-DP [N%2 ] [N] << ENDL。 } 戻り 0 。 }