📅  最后修改于: 2023-12-03 15:10:35.814000             🧑  作者: Mango
这个问题可以被转化为一个最长公共子序列问题。我们需要找出由交替符号构成的最长公共子序列,并计算其和。
我们可以用动态规划解决这个问题。假设字符串A和B是由交替符号构成的,即:
A = s1, s2, s3, ..., sn
B = t1, t2, t3, ..., tn
我们用dp[i][j]
表示A的前i个字符和B的前j个字符之间的最长公共子序列长度。
如果s[i] == t[j]
,则该字符可以被包含在最长公共子序列中。我们可以在前面的子序列中添加这个字符,因此:
dp[i][j] = dp[i-1][j-1] + s[i]
否则,该字符不能被包含在最长公共子序列中。在这种情况下,我们需要在前一个字符串中找到一个更短的最长公共子序列。因此:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
注意到我们需要在dp表中维护其和的最大值,在每次更新时都需要计算。
def alternating_longest_subsequence(A, B):
n, m = len(A), len(B)
dp = [[0 for j in range(m+1)] for i in range(n+1)]
# update dp table
for i in range(1, n+1):
for j in range(1, m+1):
if A[i-1] == B[j-1]:
dp[i][j] = dp[i-1][j-1] + A[i-1]
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
# calculate max sum of alternating subsequence
max_sum = 0
for i in range(1, n+1):
for j in range(1, m+1):
if dp[i][j] != '':
sum_ = sum(map(int, filter(str.isdigit, dp[i][j])))
if sum_ > max_sum:
max_sum = sum_
return max_sum, dp[n][m]