パスワードが削除されました
プラネットXの考古学者は、古代から残っている多くのコードを発見しました。これらのコードは、4つの植物A、B、C、およびDの種子で構成されるシーケンスです。注意深く分析すると、これらのパスワード文字列は対称的である必要があることがわかりました(つまり、ミラー文字列と呼ばれるもの)。
年齢により、種子の多くが脱落し、鏡像特性を失う可能性があります。
あなたの仕事は次のとおりです。
現在表示されているパスワード文字列を指定して、現在の状態になる前に元の状態から削除する必要のあるシードの数を計算します。
現在表示されているパスワード文字列(長さが1000以下)
には、少なくともドロップされるシードの数を示す正の整数が必要であることを示す行を入力します。
たとえば、入力:
ABCBA
、プログラムは出力する必要があります:
0
別の例、入力:
ABDCDCBABC
、プログラムは出力する必要があります:
3
アイデア:
最初に2次元リストdp [i] [j]を作成します。dpはs [i:j + 1]を意味し、eは選択した文字の長さを意味します。文字の長さが1の場合、それはパリンドローム文字であるため、dp [ i] [j] = 1、i、jは、選択したeの長さのすべての連続文字をトラバースしています。彼がパリンドローム文字でいっぱいかどうかは関係ありません。dp[i] [j] = max(dp [i + 1] [j ]、dp [i] [j-1])、s [i] == s [j]の場合:dp [i] [j]自体とdp [i + 1] [j-1]を判断する理由s [i] [j]は+ 2、dp [i + 1] [j-1] +2に等しい。次に、n-dp [0] [n-1]が私たちの答えです。
プログラム:
s=input()
n=len(s)
dp=[[0 for i in range(n)]for i in range(n)]
for e in range(1,n+1):
i=0
while i+e-1<n:
j=i+e-1
if e==1:
dp[i][j]=1
i+=1
continue
dp[i][j]=max(dp[i+1][j],dp[i][j-1])
if s[i]==s[j]:
dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2)
i+=1
print(n-dp[0][n-1])
転載は禁止されています。自習のみ。プログラムエラーについては責任を負いません。