bzoj2560 串珠子 状压DP】的更多相关文章

2560: 串珠子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 515  Solved: 348[Submit][Status][Discuss] Description 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在ci,j根不同颜色的绳子中选择一根将它们连接.如果把珠子看作点,把绳子看作边,将所…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2560 题解 大概是这类关于无向图的联通性计数的套路了. 一开始我想的是这样的,考虑容斥,那么就是令 \(dp[i][S]\) 表示我钦定了 \(i\) 个连通块必须断开其余随意的方案数,然后 DP 完以后容斥加起来就可以了. 但是这样是 \(O(3^nn)\) 的,好像没有前途. 然后想到这个关于无向连通图计数的套路:用对于每一个状态,用总的方案数减去不连通的方案数.但是为了不连通的方案数不…
题目描述 有 $n$ 个点,点 $i$ 和点 $j$ 之间可以连 $0\sim c_{i,j}$ 条无向边.求连成一张无向连通图的方案数模 $10^9+7$ .两个方案不同,当且仅当:存在点对 $(i,j$ ,使得 $i$ 与 $j$ 之间的边数不同. 输入 标准输入.输入第一行包含一个正整数n,表示珠子的个数.接下来n行,每行包含n个非负整数,用空格隔开.这n行中,第i行第j个数为ci,j. 输出 标准输出.输出一行一个整数,为连接方案数对1000000007取模的结果. 样例输入 3 0 2…
(Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 915 Solved: 603 [Submit][Status][Discuss] Description 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不用绳…
[BZOJ2560]串珠子 Description 铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在ci,j根不同颜色的绳子中选择一根将它们连接.如果把珠子看作点,把绳子看作边,将所有珠子连成一个整体即为所有点构成一个连通图.特别地,珠子不能和自己连接. 铭铭希望知道总共有多少种不同的方案将所有珠子连成一个整体.由于答案可能很大,因此只需输出答案对10…
题目 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入格式 第一行是一个正整数n(n<=12),表示给定的字符串的个数. 以下的n行,每行有一个全由大写字母组成的字符串.每个字符串的长度不超过50. 输出格式 只有一行,为找到的最短的字符串T.在保证最短的前提下, 如果有多个字符串都满足要求,那么必须输出按字典序排列的第一个. 输入样例 2 ABCD BCDABC 输出样例 ABCDABC 题解 写完状压dp后才知道…
题意: 输入正整数n和k(1<=n<=400,1<=k<=10),求长度为n的01串中有多少个不含长度至少为k的回文连续子串.例如,n=k=3时只有4个串满足条件:001,011,100,110. 分析: 做这题的时候走了很多弯路,自以为想到了一个不用表示状态的dp,然而在保证不回文的时候就发现了很多问题.其实本题k的规模很小,所以应该要想到状压的.一个串中只要保证不含长度为k也不含长度为k+1的回文串,那么就不会出现大于k的回文串,所以我们构造的时候只要保证前面两个条件符合即可.…
铭铭有n个十分漂亮的珠子和若干根颜色不同的绳子.现在铭铭想用绳子把所有的珠子连接成一个整体. 现在已知所有珠子互不相同,用整数1到n编号.对于第i个珠子和第j个珠子,可以选择不用绳子连接,或者在ci,j根不同颜色的绳子中选择一根将它们连接.如果把珠子看作点,把绳子看作边,将所有珠子连成一个整体即为所有点构成一个连通图.特别地,珠子不能和自己连接. 铭铭希望知道总共有多少种不同的方案将所有珠子连成一个整体.由于答案可能很大,因此只需输出答案对1000000007取模的结果. Solution 神仙…
我有病吧--明明直接枚举是否匹配就可以非要写hash,然后果然冲突了(--我个非酋居然还敢用hash 设f[s][i]为已选串状态为s并且最后一个串是i,还有预处理出g[i][j]表示最长有长为g[i][j]的i串后缀等于j串前缀这里,直接暴力匹配即可-- 然后注意到比较麻烦的事要求字典序最小,但是因为空间限制我们又不能给每个f存一个串,所以我们设t[s][i][j]为状态使f[s][i]长度最小且字典序最小的选串顺序的第j个选的是那个串,这个更新f[s][i]的时候直接更新,注意如果有等于当前…
按照子串出现的先后考虑.令f[i][j]为已经出现的字符串集合为i,最后一个出现的字符串为j时的最短串长,预处理一下任意两个串的最长重叠长度,转移显然.有点麻烦的是字典序,强行增加代码难度. 另一个比较简单的做法是上AC自动机,建出来后类似地令f[i][j]为已经出现的字符串集合为i,在自动机上点j时的最短串长,相当于跑一个最短路,bfs时每次优先选字典序最小的边即可. #include<iostream> #include<cstdio> #include<cmath>…