二进制、数位dp:0912T3
本文搬运自本人高中时期CSDN博客,若图片加载不出来,可到原文查看:https://blog.csdn.net/zhangtingxiqwq/article/details/132840291
考虑题目转化,二进制下满足 i⊆j,(i+x)⊆(j+y)
这显然是个数位dp形式
考虑枚举每一位与进位, dpk,p1,p2 表示第 k−1 位向第 k 位,分别进位 p1,p2 的方案数
考虑当前 (i,j) 二进制下分别为 q1,q2 ,则 (i+x,j+y)=(p1+q1+xi,p2+q2+yi)=(n1,n2)
必须满足 q1⊆q2,n1&1⊆n2&1 ,由 dp(i+1,2n1,2n2) 转移过来
综上:
dp(k,i,j)=q1⊆q2,n1=p1+q1+xi,n2=p2+q2+yi∑[n1&1⊆n2&1]dp(i+1,2n1,2n2)
1 2 3 4 5 6 7 8 9 10 11 12
| 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();
|