pku1699 Best Sequence

来源:互联网 发布:淘宝店铺关联打印 编辑:程序博客网 时间:2024/06/08 10:35

最近,水题不想做,只有被难题来虐,而往往做一些难题就只有:看题,想题。至于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字符串有关,仔细体会就会理解),对于这个问题,先把各个字符串之间的关系先预处理出来应该好一点。于是解决。

原创粉丝点击