Uestc1291 上天的卿學姐 狀壓dp

2021-08-16 18:18:55 字數 1517 閱讀 6903

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 ...

不要去怨恨上天的不公平

過往,將自己沉淪在悲傷的世界無法自拔。曾經,每次把自己弄的如此傷悲,卻渴望得到一絲心疼。如今,一切卻改變了思想,也許是經歷讓我學會了怎麼去跟這個世界交流,久而久之,我已不再是個孩子。我們離開教室,走進外面的世界,深入後,發現這個世界是多麼的複雜,甚至害怕的想要去逃避,思想也渴望回到曾經的單純,不會受...