https://www.hackerrank.com/challenges/tutzki-and-lcs/problem
在a中加入的那个数一定要与b中的某个数match上,然后ab各分成2部分,分别求2个pair的LCS,然后枚举一下a加入的位置就好了。
不必每次求2个pair的LCS,先跑一遍全部长度的ab的LCS即可
def LCS(a, b):
na,nb=len(a),len(b)
dp=[[0 for _ in range(nb)] for _ in range(na)]
for i in range(na):
for j in range(nb):
if a[i]==b[j]: dp[i][j]=(dp[i-1][j-1] if i>=1 and j>=1 else 0)+1
else: dp[i][j]=max(dp[i-1][j] if i>=1 else 0,dp[i][j-1] if j>=1 else 0)
return dp
def tutzkiAndLcs(a, b):
na,nb=len(a),len(b)
dp1=LCS(a,b)
dp2=LCS(a[::-1],b[::-1])
prev=dp1[-1][-1]
res=set()
# print(prev)
# print(dp1)
# print(dp2)
for i in range(0,len(a)+1):
for j in range(len(b)):
if (i,b[j]) in res: continue
t=0
if i!=0 and j!=0: t+=dp1[i-1][j-1]
if i!=na and j!=nb-1: t+=dp2[na-1-i][nb-1-j-1]
if t==prev:
# print(i,j)
res.add((i,b[j]))
return len(res)
if __name__ == '__main__':
a = input()
b = input()
result = tutzkiAndLcs(a, b)
print(result)
#print(tutzkiAndLcs('aa', 'baaa'))