2020牛客NOIP集训营-提高组(第二场)B-包含(DP)

it2025-01-11  7

题目链接

Statement

Solution

看到数据范围 a i ≤ 1 0 6 a_i \leq 10^6 ai106,首先想到 D P DP DP若考虑11011,它包含随便一位1变0的数因此我们从大到小枚举每个插入的数,将它随便一位^成0状态转移式为 d p j = ∑ i = j 1 0 6 d p i         j ⊆ i dp_j=\sum_{i=j}^{10^6}dp_i\,\,\,\,\,\,\,j\subseteq i dpj=i=j106dpiji然而有一个问题例如枚举到7时枚举了3和5,但枚举5时也算了3,出现了重复因此我们应该优先枚举位,再枚举数 #include <cstdio> const int N=1e6; int n,m,dp[N+10]; int main() { int x; scanf("%d%d",&n,&m); while(n--) scanf("%d",&x),dp[x]=1; for(int i=0;i<20;i++) for(int j=N;j;j--) if(dp[j]&&(j>>i&1)) dp[j^(1<<i)]+=dp[j]; while(m--) scanf("%d",&x),puts(dp[x]?"yes":"no"); }
最新回复(0)