YbtOJ#20070-[NOIP2020模拟赛B组Day5]诗人小K【状压dp】
正題
題目鏈接:http://noip.ybtoj.com.cn/contest/102/problem/4
題目大意
求有多少個(gè)長(zhǎng)度為nnn的序列aaa滿足1≤ai≤101\leq a_i\leq 101≤ai?≤10,且可以找到一組(i,j,k,l)(i,j,k,l)(i,j,k,l)使得(∑p=ij?1ap=x)&(∑p=jk?1ap=y)&(∑p=klap=z)(\sum_{p=i}^{j-1}a_p=x)\&(\sum_{p=j}^{k-1}a_p=y)\&(\sum_{p=k}^{l}a_p=z)(p=i∑j?1?ap?=x)&(p=j∑k?1?ap?=y)&(p=k∑l?ap?=z)
解題思路
題意轉(zhuǎn)化為有沒有一個(gè)(i,j,k,l)(i,j,k,l)(i,j,k,l)使得
(∑p=ijap=x)&(∑p=ikap=x+y)&(∑p=klap=x+y+z)(\sum_{p=i}^{j}a_p=x)\&(\sum_{p=i}^{k}a_p=x+y)\&(\sum_{p=k}^{l}a_p=x+y+z)(p=i∑j?ap?=x)&(p=i∑k?ap?=x+y)&(p=k∑l?ap?=x+y+z)
考慮狀壓,對(duì)于一個(gè)iii能被表示在集合中當(dāng)且僅當(dāng)滿足序列中有一個(gè)后綴和iii使得
- x<i<yx<i<yx<i<y且集合中有一個(gè)j=xj=xj=x
- y<i<zy<i<zy<i<z且集合中有一個(gè)j=yj=yj=y
這樣就保證如果集合中有一個(gè)zzz那么一定有一個(gè)劃分xxx和yyy。
預(yù)處理gs,ig_{s,i}gs,i?表示狀態(tài)為sss時(shí)加入一個(gè)iii能夠到達(dá)的集合
然后設(shè)fi,sf_{i,s}fi,s?表示加入到第iii個(gè)數(shù)時(shí)到達(dá)集合sss的方案數(shù)
時(shí)間復(fù)雜度O(2x+y+z(x+y+z)?10+n2x+y+z?10)O(2^{x+y+z}(x+y+z)*10+n2^{x+y+z}*10)O(2x+y+z(x+y+z)?10+n2x+y+z?10)
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll M=1<<18,XJQ=1e9+7; ll n,x,y,z,g[M][11],f[45][M]; signed main() {freopen("poem.in","r",stdin);freopen("poem.out","w",stdout);scanf("%lld%lld%lld%lld",&n,&x,&y,&z);y+=x;z+=y;ll MS=(1<<z);for(ll i=1;i<=MS;i++)for(ll j=1;j<=10;j++){g[i][j]=1;if(i==MS){g[i][j]=MS;continue;}for(ll k=0;k<z;k++){if((i>>k&1)&&k+j<=z&&!(k<x&&k+j>x)&&!(k<y&&k+j>y))g[i][j]|=1<<k+j;if(g[i][j]>MS)g[i][j]=MS;}}f[0][1]=1;for(ll i=0;i<n;i++)for(ll j=1;j<=MS;j++){if(!f[i][j])continue;for(ll k=1;k<=10;k++)(f[i+1][g[j][k]]+=f[i][j])%=XJQ;}printf("%lld",f[n][MS]); }總結(jié)
以上是生活随笔為你收集整理的YbtOJ#20070-[NOIP2020模拟赛B组Day5]诗人小K【状压dp】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样煮板栗才能好剥壳 栗子易剥壳的煮法
- 下一篇: YbtOJ#20068-[NOIP202