状压dp
pbihao
这个作者很懒,什么都没留下…
展开
-
【BZOJ 2734】[HNOI2012]集合选数 状压dp
一道不错的套路dp,首先构造矩阵,左上角为最小没有出现的数字,然后向右*3向下*2,这样只要不选相邻的数字就可以了,然后发现矩阵式log级的,状压dp莽一波。 最开始写出来10s卡过,后来看了一下被人的优化: 1.对于每一行预处理出合法的状态用flag标记 2.构造新的矩阵做dp的时候每一行一行的memset,不要一次直接写完(特别坑),否则会重复赋值很多用不上的空间 #include原创 2017-01-05 18:03:34 · 218 阅读 · 0 评论 -
【BZOJ 1072】 [SCOI2007]排列perm 状压dp
设f[i][j]表示当前状态为i余数为j的方案数,其实这个还是蛮好想得,就是一开始脑残,非要加上一维表示现在填到了第k位数字,结果时间复杂度死活过不了,真是智障qaq。 转移f[i|(1 考虑去重,其实就是用总的排列数除以每一种重复数字的个数的排列就好了。 #include #include #include using namespace std; int f[1024][1010],原创 2017-01-05 19:43:30 · 205 阅读 · 0 评论 -
【BZOJ 1097】 [POI2007]旅游景点atr
由于给出的第二个条件所以一定是要知道k+1个点之间的相互最短距离,但是Floyd肯定是没法搞的,观察k很小,直接暴力跑k次dijkstra就好了。然后设f[i][pos]表示到达i节点,经过节点状态为pos的最短距离,枚举状态然后枚举点转移就好了。 #include #include #include #include #define LL long long #define inf 0x3原创 2017-01-07 15:14:00 · 268 阅读 · 0 评论 -
【BZOJ 3067】Hyperdrome 哈希+状压
首先假设内存足够大的话可以用f[i]表示i这个状态出现了多少次,状态是指异或前缀和,那么根据题意,当且只有在i==0或者二进制表示下只有一个1的情况下是合法状态,所以每加一个字符,就更新当前前缀和,又由于A^B==C->A^C==B 那么可以预处理出所有合法状态,然后分别和当前状态异或后得到需要的状态,加入答案。 但是内存不够,不能用数组,amp貌似是一个不错的选择,呵呵,又T又mle,那么h原创 2017-02-05 17:22:00 · 476 阅读 · 0 评论