演算法競賽入門課第六節習題] 合併迴文子串 多維dp65
阿新 • • 發佈:2020-08-25
屬於A和B的字元在C中順序保持不變。問字串C中最長迴文子串的長度是多少。
題解
本題有一個關鍵點字串長度不超過50,我們想到可以用dp去解決,dp不就是優雅的暴力嘛。^_^
我們可以想到dp的定義
dp[i][j][k][l]:a串中i~j子字符串與b串中k~l子字符串合並,能否組成一個回文串。{ dp[i][j][k][l]:a串中i~j子字串與b串中k~l子字串合併,能否組成一個迴文串。}dp[i][j][k][l]:a串中i~j子字符串與b串中k~l子字符串合並,能否組成一個回文串。(1代表可以,0代表不行。)
狀態轉移:
a[j]==a[i]:dp[i][j][k][l]∣=dp[i+1][j−1][k][l] {a[j]==a[i] : dp[i][j][k][l] |= dp[i+1][j-1][k][l]}a[j]==a[i]:dp[i][j][k][l]∣=dp[i+1][j−1][k][l]
a[j]==b[k]:dp[i][j][k][l]∣=dp[i][j−1][k+1][l]{a[j]==b[k] : dp[i][j][k][l] |= dp[i][j-1][k+1][l]}a[j]==b[k]:dp[i][j][k][l]∣=dp[i][j−1][k+1][l]
b[l]==b[k]:dp[i][j][k][l]∣=dp[i][j][k+1][l−1] {b[l]==b[k] : dp[i][j][k][l] |= dp[i][j][k+1][l-1]}b[l]==b[k]:dp[i][j][k][l]∣=dp[i][j][k+1][l