hdu5119 Happy Matt Friends( DP )

来源:互联网 发布:上班记录软件 编辑:程序博客网 时间:2024/05/21 07:11

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5119

题目大意:

在N个数里面选取一些数进行异或运算(可以一个都不取),算出异或后的答案大于等于M的方案数。

思路:

dp[i][j]表示前i个异或结果为j的方案数。

于是就是取或者不取的问题。可以用滚动数组进行优化。

#include<stdio.h>    #include<string.h>    #include<algorithm>    #define ll __int64    #define M 1111111    using namespace std;    ll dp[5][2000006];    int main()    {        ll T,n,m,a[100],i,j,icase=0;        scanf("%I64d",&T);        while(T--)        {            icase++;            scanf("%I64d%I64d",&n,&m);            for(i=1;i<=n;i++)            {                scanf("%I64d",&a[i]);            }            memset(dp,0,sizeof(dp));            dp[0][0]=1;            for(i=1;i<=n;i++)                for(j=0;j<=2000005;j++)            {                dp[i%2][j]=dp[(i-1)%2][j]+dp[(i-1)%2][j^a[i]];            }            ll ans=0;            for(j=m;j<=M;j++)                {                    ans+=dp[n%2][j];                    }                    printf("Case #%I64d: ",icase);                printf("%I64d\n",ans);        }    }




0 0
原创粉丝点击