[bzoj1195][HNOI2006]最短母串_动态规划_状压dp

最短母串 bzoj-1195 HNOI-2006

题目大意:给一个包含n个字符串的字符集,求一个字典序最小的字符串使得字符集中所有的串都是该串的子串。

注释:$1\le n\le 12$,$1\le max length \le 50$。

想法:刚开始在那里AC自动机半天,然后瞅了一眼数据范围... ...状压吧兄弟!!

首先,我们先做一些预处理:把可以被字符集中串包含的串都删掉;求出两个字符串连接后的长度(这个预处理暴力即可),设merge[i][j]表示串i和串j合并后的长度。

状态:dp[s][i]表示这个串已经包含了s状态的字符串且紧跟着的串是i的最短长度。

转移:dp[s][i]=min{dp[s^(1<<(j+1))][j]+merge[i][j]-length(j)};

最后,附上丑陋的代码... ...

#include
#include
#include
#include
#include
using namespace std;
const int INF=0x3f3f3f3f;
const int mxn=61;
int n;
struct bind
{
    char s[605];
    int len;
    bool operator < (const bind y) const
	{
        if(len!=y.len)return len>j)&1)
                for(int k=0;k>k)&1) continue;
                    bind tmp=merge(i,j,k);
                    if(tmp

小结:看到了数据做题是一种解题想法,但是考试的时候看数据范围猜复杂度我tm就没成功过... ...

转载于:https://www.cnblogs.com/ShuraK/p/9348420.html

你可能感兴趣的:([bzoj1195][HNOI2006]最短母串_动态规划_状压dp)