pku1699 Best Sequence

最近,水题不想做,只有被难题来虐,而往往做一些难题就只有:看题,想题。至于coding就基本没发下手,难题的解题思路实在太难想了,以致于最近很难才能ac一道题。于是找道水题来玩玩找点自信。

题目链接:http://162.105.81.212/JudgeOnline/problem?id=1699

题意简述:给定n个字符串,求把这些字符串连起来的长度最小,只有某一段相同的才能覆盖相连,不然只能头对头相连(这样长度肯定是最长的)。

解题思路:

看到这道题时,感觉 暴力+预处理 都能过:无非就是枚举所有n的全排列再计算,而n最多只有10,计算量最多也只有几百万1000ms 应该能挤过,况且在dfs的过程还能剪一些枝。

但这题用状态压缩dp的效率却要高的多:2^10*10^2 。这样,计算量显然就小多了。设dp[i][j]表示状态为i,最后一个字符串是j时的最优值。那么目标状态即是:2^n-1。实现的过程就是:枚举状态、最后一个字符串和倒数第二个字符串(简单说明:设以j字符串结尾的状态为state,那么dp[state][j]只与state-2^j这个状态的结尾k字符串有关,仔细体会就会理解),对于这个问题,先把各个字符串之间的关系先预处理出来应该好一点。于是解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值