码迷,mamicode.com
首页 > 其他好文 > 详细

cf round 482E Kuro and Topological Parity

时间:2018-05-26 22:19:23      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:+=   class   mil   ring   mat   round   family   偶数   cal   

题意:一个长度为$n$的序列,一些地方是$0$,一些地方是$1$,$-1$的地方你可以选择填$0$或者$1$,你可以选择连一些边$x->y$满足$x<y$

请问有多少种填数并连边的方法,使得交错路的个数的奇偶性是$p$

$n \leq 50$

5维dp,可以减一维

原本的5维分别是:现在考虑的是第几个位置,当前有多少个以1为结尾的长度为偶数的交错路,当前有多少个以1为结尾的长度为奇数的交错路

当前有多少个以0为结尾的长度为偶数的交错路,当前有多少个以0为结尾的长度为奇数的交错路

dp的值是方案数

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
#define db double
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
const int maxn=50+7;
const ll mod=1e9+7;
ll n,Px,col[maxn],mi[maxn],ans;
ll dp[maxn][maxn][maxn][maxn],C[maxn][maxn],Cd[2][maxn];//black,0/1,white,0/1

char cc; ll ff;
template<typename T>void read(T& aa) {
	aa=0;cc=getchar();ff=1;
	while((cc<‘0‘||cc>‘9‘)&&cc!=‘-‘) cc=getchar();
	if(cc==‘-‘) ff=-1,cc=getchar();
	while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();
	aa*=ff;
}

int main() {
	read(n); read(Px);
	For(i,1,n) read(col[i]);
	C[0][0]=1;
	For(i,1,n) {
		C[i][0]=1;
		For(j,1,i) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
	}
	For(i,0,n) {
		For(j,0,i) Cd[j&1][i]+=C[i][j];
		Cd[0][i]%=mod; Cd[1][i]%=mod;
	}
	mi[0]=1; For(i,1,n) mi[i]=mi[i-1]*2%mod;
	dp[0][0][0][0]=1; ll r,x;
	For(i,1,n) For(j,0,i) For(k,0,i-j) For(t,0,i-j-k) {
		r=i-j-k-t;
		if(col[i]!=1&&j+k>0) {//black,0/1
			x=mi[j+k-1]*mi[t]%mod;
			if(j) //black,0
				dp[i][j][k][t]+=x*dp[i-1][j-1][k][t]%mod*Cd[1][r]%mod;
			if(k) //black,1
				dp[i][j][k][t]+=x*dp[i-1][j][k-1][t]%mod*Cd[0][r]%mod;
		}
		if(col[i]!=0&&t+r>0) {
			x=mi[t+r-1]*mi[j]%mod;
			if(t) //white,0
				dp[i][j][k][t]+=x*dp[i-1][j][k][t-1]%mod*Cd[1][k]%mod;
			if(r) //white,1
				dp[i][j][k][t]+=x*dp[i-1][j][k][t]%mod*Cd[0][k]%mod;
		}
		dp[i][j][k][t]%=mod;
		if(i==n&&((k+r)&1)==Px) ans+=dp[i][j][k][t];
	}
	printf("%lld\n",ans%mod);
	return 0;
}

  

cf round 482E Kuro and Topological Parity

标签:+=   class   mil   ring   mat   round   family   偶数   cal   

原文地址:https://www.cnblogs.com/Serene-shixinyi/p/9094435.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!