ContestHunter #26 B 玩骰子
生活随笔
收集整理的這篇文章主要介紹了
ContestHunter #26 B 玩骰子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CH轉移服務器上不去了,鏈接就不貼了。
題目簡述:
擲N枚骰子,若擲到點數分別為A1,A2,An的[有序]集合,若該集合有一個子集之和為m,則稱該集合為好集,問在N枚骰子的所有有序集合中取到一個好集的概率。 N<=9 ?,M<=54
官方題解:爆搜+打表 ?= =
以下題解,雖然不是我想出來的。 (BY:diamondlx)
令n個骰子投出來的數為 A1,A2..An
A集合的子集能組合出來的數就是A1..An做一次布爾01背包
這樣的復雜度是 O(6^n*(54*n)) 是要TLE的。
考慮到布爾01背包其實是只有01狀態的,最大又只有54位,所以用long long 狀壓一下,令之為lop!
并且在dfs骰子的值的過程中轉移(一邊dfs一邊轉移):lop | (lop << i ) 轉移是O(1)的!
比如本次枚舉第x個骰子值是 i,下一次dfs就是:
dfs( x + 1 , lop | ( lop << i ) ) ;
最后只用查詢 lop&(1<<m) 是否為真即可判斷該集合是否有子集和為m
復雜度 O(6^n)
contesthunter上不去,代碼不貼了。。
總結
以上是生活随笔為你收集整理的ContestHunter #26 B 玩骰子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何解决 win10 2016Excel
- 下一篇: Ant UI 的表单校验