トピックの背景
IOI2000最初の質問
タイトル説明
これは、対称パリンドローム単語列です。任意の与えられた文字列は、文字の数を挿入することで、言葉はパリンドロームになることができます。タスクは、この質問は、与えられた文字列が単語の回文を挿入するために必要な文字の最小数となり得ることです。
例えば、2つの文字を挿入した後、「Ab3bdは」パリンドローム単語「dAb3bAd」または「Adb3bdA」に変えることができるが、挿入する文字が2つの未満のパリンドロームワードになることはできません。
注:この問題は、大文字と小文字が区別されます
入力形式
文字列(0 <STRLEN <= 1000)
出力フォーマット
1及びある唯一の整数、挿入する文字の最小数があります
サンプル入力と出力
入力#1
Ab3bd
出力#1
2
書式#include <アルゴリズム> 書式#include <iostreamの> の#include <CStringの> の#include <cstdioを> する#include <cmath> の#include <キュー> std名前空間を使用しました。 整数nを、DP [5001] [5001]。 チャー0009 [5001]、STR2 [5001]。 INTメイン(){ scanf関数( "%sの"、STR1 + 1)。 N = STRLEN(STR1 + 1)。 以下のために(INT i = 1; iが<= N; iは++){ STR2 [I] = 0009 [N-I + 1]。 } {ため(iは++; iがn = <I = 1 INT) のために(int型のJ = 1; J <= nであり、j ++){ IF(STR1 [i]は== STR2 [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 [n]は[N])。 0を返します。 }