hdu 5119
Posted liqgnonqfu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 5119相关的知识,希望对你有一定的参考价值。
题目大意:
Matt的n个朋友都有数字,Matt可以选其中几个(可以是零)异或起来,若结果不小于数m,Matt就赢,问Matt赢的方法数。(1 ≤ N ≤ 40, 0 ≤ M ≤ 10 6).
思路:
f[i][j]表示到第i个朋友,异或结果为j的方法数。
转移方程:f[i][j]=f[i-1][j^a[i]]+f[i-1][j]。
我的代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<iostream> 6 7 using namespace std; 8 9 const int maxn=(1<<20); 10 11 long long f[41][maxn+1]; 12 int T,n,m,a[41]; 13 14 int main() 15 { 16 scanf("%d",&T); 17 for(int I=1;I<=T;I++) 18 { 19 scanf("%d%d",&n,&m); 20 for(int i=1;i<=n;i++) 21 { 22 scanf("%d",&a[i]); 23 } 24 memset(f,0,sizeof(f)); 25 f[0][0]=1; 26 // cout<<f[n][maxn]; 27 for(int i=1;i<=n;i++) 28 { 29 for(int j=0;j<maxn;j++) 30 { 31 f[i][j]=f[i-1][j^a[i]]+f[i-1][j]; 32 } 33 } 34 //cout<<f[n][maxn]; 35 long long ans=0; 36 for(int i=m;i<maxn;i++) 37 { 38 ans=f[n][i]+ans; 39 // printf("::%I64d "); 40 } 41 printf("Case #%d: %I64d ",I,ans); 42 } 43 return 0; 44 45 }
如果有不幸的同学一直TLE,就试试滚动数组吧,队友今天写的也一直TLE,但不知道为什么改滚动数组就A了。
/********若有大佬指点上述问题,不胜感激。*********/
以上是关于hdu 5119的主要内容,如果未能解决你的问题,请参考以下文章