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