题解 | #小欧的最短路#

小欧的最短路

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
点赞 评论 收藏
分享
人力小鱼姐:实习经历没有什么含金量,咖啡店员迎宾这种就别写了,其他两段包装一下 想找人力相关的话,总结一下个人优势,结合校园经历里有相关性的部分,加一段自我评价
点赞 评论 收藏
分享
半解316:内容充实,细节需要修改一下。 1,整体压缩为一页。所有内容顶格。 2,项目描述删除,直接写个人工作量 修改完之后还需要建议,可以私聊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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