二进制、数位dp:0912T3

考虑题目转化,二进制下满足 i ⊆ j , ( i + x ) ⊆ ( j + y ) i\subseteq j,(i+x)\subseteq (j+y) ij,(i+x)(j+y)

这显然是个数位dp形式

考虑枚举每一位与进位, d p k , p 1 , p 2 dp_{k,p_1,p_2} dpk,p1,p2 表示第 k − 1 k-1 k1 位向第 k k k 位,分别进位 p 1 , p 2 p_1,p_2 p1,p2 的方案数

考虑当前 ( i , j ) (i,j) (i,j) 二进制下分别为 q 1 , q 2 q_1,q_2 q1,q2,则 ( i + x , j + y ) = ( p 1 + q 1 + x i , p 2 + q 2 + y i ) = ( n 1 , n 2 ) (i+x,j+y)=(p_1+q_1+x_i,p_2+q_2+y_i)=(n_1,n_2) (i+x,j+y)=(p1+q1+xi,p2+q2+yi)=(n1,n2)

必须满足 q 1 ⊆ q 2 , n 1 & 1 ⊆ n 2 & 1 q1\subseteq q2,n1\&1\subseteq n2\&1 q1q2,n1&1n2&1,由 d p ( i + 1 , n 1 2 , n 2 2 ) dp(i+1,\frac{n_1}2,\frac{n_2}2) dp(i+1,2n1,2n2) 转移过来

综上:
d p ( k , i , j ) = ∑ q 1 ⊆ q 2 , n 1 = p 1 + q 1 + x i , n 2 = p 2 + q 2 + y i [ n 1 & 1 ⊆ n 2 & 1 ] d p ( i + 1 , n 1 2 , n 2 2 ) \Large dp(k,i,j)=\sum_{q1\subseteq q2,n1=p1+q1+x_i,n2=p2+q2+y_i}[n1\&1\subseteq n2\&1]dp(i+1,\frac{n_1}2,\frac{n_2}2) dp(k,i,j)=q1q2,n1=p1+q1+xi,n2=p2+q2+yi[n1&1n2&1]dp(i+1,2n1,2n2)

dp[n][0][0].a[1]=1; 
for(i=n-1; i>=0; --i) {
	for(p1=0; p1<=1; ++p1) for(p2=0; p2<=1; ++p2) {
		for(q1=0; q1<=1; ++q1) for(q2=q1; q2<=1; ++q2) {
			n1=p1+q1+x[i]; n2=p2+q2+y[i]; 
			if(n1%2>n2%2) continue; 
			dp[i][p1][p2]=dp[i][p1][p2]+dp[i+1][n1/2][n2/2]; 
		}
	}
	
}
dp[0][0][0].print(); 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值