20230411-動的プログラミング

動的プログラミング

1. 距離を編集する

3 つの操作: 文字の挿入、文字の削除、文字の置換

例 1:
word1='horse',word2='ros'
3 ステップ: horse–rorse–rose=ros
例 2:
word1='intention',word2='execution'
5 ステップ:意図-削除 t-意図-置換- enention-replace-exention-replace-exection-insert-execution
分析:
dp[i][j] は、最後に編集された、添字 i-1 で終わる文字列 word1 と添字 j-1 で終わる文字列 word2 を表します。距離は dp[i][j] です。
ここに画像の説明を挿入

def fun(s1,s2):
    dp=[[0 for i in range(len(s2)+1)] for i in range(len(s1)+1)]
    for i in range(len(s1)+1):
        for j in range(len(s2)+1):
            if i==0:
                dp[i][j]=j
            elif j==0:
                dp[i][j]=i
            elif s1[i-1]==s2[j-1]:
                dp[i][j]=dp[i-1][j-1]
            else:
                dp[i][j]=min(dp[i-1][j-1]+1,dp[i-1][j]+1,dp[i][j-1]+1)
    return dp[-1][-1]

s1='horse'
s2='ros'
fun(s1,s2)

2回文子串

文字列を指定すると、この文字列内に回文部分文字列がいくつあるかを数える必要があります。
入力: "abc" 出力: 3 説明: 3 つの回文部分文字列: "a"、"b"、"c" 入力: "aaa" 出力: 6 説明: 6 つの回文部分文字列: "a"、"a"、"a
" 、"aa"、"aa"、"aaa"
dp[i,j] は s[i,j] 閉区間を意味し、s1 が回文部分文字列であるかどうか
dp[i,j]= if s[i ]==s[ j]、分類の議論: 1.i=j、つまり 1 文字、はい; 2.|ij|=1、2 文字、はい; 3. dp[i+1,j-1] True
ここに画像の説明を挿入

def fun(s):
    dp=[[0 for i in range(len(s))] for i in range(len(s))]
    for i in range(len(s)-1,-1,-1):
        for j in range(i,len(s)):
            if s[i]==s[j]:
                if i==j:
                    dp[i][j]=1
                elif j-i==1:
                    dp[i][j]=1
                else:
                    dp[i][j]=1 if dp[i+1][j-1]==1 else 0
    return dp

s='bbbab'
fun(s)
3. 最長回文部分列

文字列 s を指定すると、最長の回文サブシーケンスを見つけてシーケンスの長さを返します。
入力: "bbbab" 出力: 4 可能な最長の回文サブシーケンスは "bbbb" です。
dp[i][j]: 次の最長の回文サブシーケンスの長さ範囲 [i, j] の文字列 s は dp[i][j] です。

ここに画像の説明を挿入

def fun(s):
    dp=[[0 for i in range(len(s))] for i in range(len(s))]
    for i in range(len(s)-1,-1,-1):
        for j in range(i,len(s)):
            if i==j:
                dp[i][j]=1
            elif s[i]==s[j]:
                dp[i][j]=dp[i+1][j-1]+2
            else:
                dp[i][j]=max(dp[i+1][j],dp[i][j-1])
    return dp[0][-1]

s='bbbab'
fun(s)

おすすめ

転載: blog.csdn.net/F13122298/article/details/130073569