A姓女友,B姓女友,渣男與最長公共子串(有視頻)

感謝你幫我完成這次AB測試。

共同的渣男問題

這是一篇技術貼, 一起探討用算法的眼光看待生活問題!

上一篇技術貼最火的瓜,得用動態規劃來吃
重點是動態規劃,希望大家把重點放到算法上。

A小姐與B小姐同是xx圈新生力量,這些年遇到了不少渣男,某日兩人談起此事,突發奇想,要不統計一下咱倆共同遇到的渣男吧!

A小姐提供名單如下“ABCDGH” 
B小姐提供名單如下“AEDFHR"
字符串的含義:A代表A姓渣男,B代表B姓渣男依次類推
答案:共同子串長度爲3

幸虧人數不多,兩人可以慢慢比較。但如果人數過多呢?小姐姐提供的渣男名單很長呢?大家自行腦補一下,如果名單超過了100個,兩個小姐姐估計就會浪費寶貴的青春了。
你決定出手拯救她們,你能想到一個快速的解決方案嗎?
想不到?沒關係,我來教你,這其實是動態優化問題的一類,最長公共子串問題。

動態規劃大殺器表格

在這裏插入圖片描述

先準備表格,格式如上。
{}代表空集,也就是沒有,沒有自然就是0了,所以順着紅色,綠色箭頭方向用0初始化。

在這裏插入圖片描述
如圖中的綠色表格,代表A小姐提出的{A} 與 B小姐提出的{A} 此時這個序列的最後一個元素是一樣的,所以直接把"左上角"的紅色數值0 + 1

在這裏插入圖片描述
如圖中的紅色表格,代表A小姐提出的{A} 與 B小姐提出的{A,E} 此時這個序列的最後一個元素是不一樣的,所以觀察紅色表格的上方,和紅色表格左面的綠色表格數值,然後取最大值。
在這裏插入圖片描述
如圖中的紅色表格,代表A小姐提出的{A,B} 與 B小姐提出的{A} 此時這個序列的最後一個元素是不一樣的,所以觀察紅色表格的上方,和紅色表格左面的綠色表格數值,然後取最大值。

按照這個規則,最後完整的表格如下在這裏插入圖片描述

最後的3就是最終的結果。

最後奉上代碼

def lcs(str1, str2, m, n):
    dp = [[0] * (n+1) for _ in range((m+1))]
    for i in range(1, m+1):
        for j in range(1, n+1):
            left = dp[i][j-1]
            up = dp[i-1][j]
            left_up = dp[i-1][j-1]
            if str1[i-1] == str2[j-1]:
                dp[i][j] = left_up + 1
            else:
                dp[i][j] = max(left, up)
    print(dp)
    return dp[m][n]
str1 = "ABCDGH" 
str2 = "AEDFHR"
m = len(str1)
n = len(str2)

res = lcs(str1, str2, m, n)
res

恭喜你,又掌握了一個動態規劃問題,爲你點贊!~

如果你身邊有和你一樣的小夥伴也關注動態規劃問題,請轉發給他。
這個世界不光需要知識的創作者,也需要知識的傳播者!
謝謝

你還知道生活中哪些LCS問題?

歡迎大家把你的思考寫到評論區

更多內容請見視頻

視頻內容講解的比較細緻,推薦兩倍速觀看

就這一次幹翻動態規劃 - Longest Common Subsequence

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章