状态压缩:枚举子集(最优组队)(ybtoj)(动态规划)
解析
很裸的狀壓dp
但是直接暴力的話狀態(tài)2n,枚舉2n
乘在一起會(huì)T誒
怎么辦呢?
使用下面這個(gè)循環(huán),就可以保證只會(huì)枚舉當(dāng)前狀態(tài)s的子集
證明
舉舉例子就挺明顯了
為什么不重不漏呢?
首先i肯定單調(diào)不降,所以不重是很明顯的
我們只需要證明不漏了,也就是(i-1&s,i-1]沒(méi)有s的子集
也挺明顯的
首先前提條件是i是s的子集
然后i減了1
會(huì)發(fā)生什么呢?
如果i最后一位是1減成0顯然還是子集
那么考慮退位的情況
假設(shè)退位到第k位,差不多可以寫(xiě)成:
s:…1abcd
i…10000
i-1:…01111
i-1&s:…0abcd
(這里k就等于5啦)
那就很顯然了
取&后會(huì)且只會(huì)把i-1k位之后變成與s相同
而這之間(01111與0abcd之間)很顯然沒(méi)有s的子集啦
這叫什么證明
反正說(shuō)明白了就行了awa
時(shí)間復(fù)雜度
這樣時(shí)間復(fù)雜度是多少捏?
對(duì)于一個(gè)有k個(gè)1的狀態(tài)s,顯然其子集數(shù)(也就是每個(gè)狀態(tài)s的枚舉數(shù))為:
2k
對(duì)于長(zhǎng)度為n的序列,其有k個(gè)1的狀態(tài)s的個(gè)數(shù)為:
C(k,n)
然后根據(jù)乘法原理:
總的時(shí)間復(fù)雜度應(yīng)該是:
∑C(k,n) *2k(0<=k<=n)
再加個(gè)東西:
∑C(k,n) ?*? 2k?*? 1n-k(0<=k<=n)
就變成多項(xiàng)式定理啦
所以時(shí)間復(fù)雜度就是:
(2+1)n = 3n
thanks for reading!
總結(jié)
以上是生活随笔為你收集整理的状态压缩:枚举子集(最优组队)(ybtoj)(动态规划)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 斯莫格推出苹果 iPhone 15 Pr
- 下一篇: P2403 [SDOI2010]所驼门王