您的位置:首页 > 其它

poj1795

2015-06-26 16:31 183 查看

题目描述:

用长度最短的的字符串来使得可以覆盖已经给出的字符,加一个为开头状态。一共有15个字符串,每个串长度<=200

题解:

字符串拼接,实际上就是可能有相邻字符串有重复的可以不再弄.重复的多一点就变成了包含.本来是15!的复杂度.但是我们发现其实出去最后一个串,那么我们再接上最后一个串的代价其实之和前面串的最后一个串有关(先叉一下:要想这样做,设i后面接j,那么j绝对不能把i给吃了,这样就会涉及到i之前的了,但是我们想想,i在前,j把i吃了,就是i真包含在j里面,因此我们需要特殊的预处理:如果a包含在b内,那么a就不要了.我们的dp中不能出现a.).这样想似乎可以dp了,怎么写可以搞乱顺序呢?发现用状压竟然可以描述:dp[sta][i],搞完sta并且最后一个是i的花费值.从sta=0开始更新.真是巧妙,一个本身根顺序有关的被变成了用sta来指明路.

特别的,这道题要我们输出字典序最小的….那么我们就一直往前添加字符串就好了呗.最后枚举第一个字符串是谁

重点:

用状压+最后一个来描述一个顺序不确定的dp.

代码:


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: