description
眾所周知,卿學姐十分擅長資料結構。
一天卿學姐開始研究起二維偏序的問題,卿學姐三下五除二就寫了個樹狀陣列解決了。
於是卿學姐開始做三維的問題,搞了個樹套樹也是過了。
欲求不滿的卿學姐直接開始搞五維的偏序,仔細思索之後,卿學姐研究出一種用分塊加bitset的做法。
峰迴路轉,沈寶寶問感覺自己要上天的卿學姐16維偏序怎麼做,卿學姐現在還在研究六維偏序,不得不將這個問題交給你。
為了簡單起見,現在有nn個mm維01向量,定義向量uu大於等於向量vv,當且僅當向量uu中的每個分量都大於等於vv中對應位置的分量,即:
ui≥vi,1≤i≤m
現在問這個向量序列中有多少個子序列是單調不減的子串行。
由於答案可能很大,所以輸出結果取模1e9+7
input
第一行兩個整數n,m分別表示向量的個數和向量的維度。
接下來nn行m列,第ii行為乙個01的字串,長度是m,表示第i個向量
1≤n≤200000,1≤d≤16
output
輸出乙個整數,表示單調不減子串行的個數
sample input and output
3 2
00 00
114 3
110
100
011
101hint
對於第二個樣例來說,如果子串行最後的長度是1,我們總共能構造4個,如果最後的長度是2,我們能構造乙個。
解題思路:
很容易想到o(
2m) o(2
m)
的狀壓dp。
一種是f[i]表示以i結尾的方案數,o(
2m) o(2
m)
列舉子集狀態確定新增方案數,o(
1)o (1
)轉移;
一種是f[i]表示結尾小等於i的方案數,o(
1)o (1
)確定新增方案數,o(
2m) o(2
m)
列舉超集轉移;
考慮如何優化.
折半狀態,結合兩種演算法,f[i][j]表示前8位確定為i,後8位是j的子集的方案數,確定新增方案數和轉移就都是om
/2o m/
2的了。
#include
using
namespace
std;
const
int mod=1e9+7;
int n,m,x,f[1
<<8][1
<<8];
char s[16];
int main()
for(int i=b;i<(1
<<8);i=(i+1)|b)f[a][i]=(f[a][i]+tmp)%mod;
}int ans=0;
for(int i=0;i<(1
<<8);i++)ans=(ans+f[i][255])%mod;
cout
0;}
1291 快斗的煩惱
描述 話說黑羽快斗 大家都知道吧 又一次成功潛入了某個博物館,而眼前寶石的數量之多也是他事先未料到的。面對著數量如此多的珠寶,快斗在嘆息自己帶的揹包太小之餘,也在煩惱著該如何帶走最大價值的寶石。快斗很快就把寶石收集到了一起,對於每一枚寶石,快斗給出了它的價值。然而,並不是價值高的寶石就應該帶走。由於...
uestc 1904 樹上的鳥兒
本題是要求最多的鳥的數量,不一定在最後 所以先把滿足題意的能配對的先確定下來 然後要開始遍歷查詢最大,在便利是在時間段n中進行的,把這個時間段能配對的鳥的數量,和雄鳥沒配對的數量 因為每到飛走的時間 就是這個時間段總時間 include stdio.h include string.h int a ...
不要去怨恨上天的不公平
過往,將自己沉淪在悲傷的世界無法自拔。曾經,每次把自己弄的如此傷悲,卻渴望得到一絲心疼。如今,一切卻改變了思想,也許是經歷讓我學會了怎麼去跟這個世界交流,久而久之,我已不再是個孩子。我們離開教室,走進外面的世界,深入後,發現這個世界是多麼的複雜,甚至害怕的想要去逃避,思想也渴望回到曾經的單純,不會受...