日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

状态压缩:枚举子集(最优组队)(ybtoj)(动态规划)

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 状态压缩:枚举子集(最优组队)(ybtoj)(动态规划) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

解析

很裸的狀壓dp
但是直接暴力的話狀態2n,枚舉2n
乘在一起會T誒
怎么辦呢?
使用下面這個循環,就可以保證只會枚舉當前狀態s的子集

for(int i=(s-1)&s;i;i=(i-1)&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)(动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。