第7回州コンテストjavaテスト質問10:パスワードドロップ

パスワードが削除されました


プラネット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])

転載は禁止されています。自習のみ。プログラムエラーについては責任を負いません。

おすすめ

転載: blog.csdn.net/weixin_46640345/article/details/112528416