题解 | #小欧的最短路#
小欧的最短路
http://www.nowcoder.com/questionTerminal/dcdac37856144dd58faf7e8c8450c8aa
from collections import deque
n = int(input())
s = input()
n = len(s)
dp = [float('inf')] * n
dp[0] = 0
dmap = {}
# 使用 deque 来优化状态转移
dmap.setdefault(s[0], deque([0]))
for i in range(1, n):
dp[i] = dp[i - 1] + abs(ord(s[i]) - ord(s[i - 1]))
# 如果之前有相同的字符出现过
if s[i] in dmap:
# 通过 deque 来保持可能的最小值位置
while dmap[s[i]] and dp[dmap[s[i]][0]] + pow(2, i - dmap[s[i]][0] - 1) >= dp[i]:
dmap[s[i]].popleft()
for j in dmap[s[i]]:
dp[i] = min(dp[i], dp[j] + pow(2, i - j - 1))
dmap.setdefault(s[i], deque()).append(i)
print(dp[-1])