题解 | #小欧的最短路#

小欧的最短路

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])
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-15 17:09
点赞 评论 收藏
分享
07-14 13:47
门头沟学院 Java
Lynn012:你评估好自己的位置了吗《顶尖应届》
投递小米集团等公司7个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 18:30
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务