HDU 5119 Happy Matt Friends(DP)
2015-06-16 21:45
381 查看
题目链接:传送门
题意:
给定n个数,求从中选出任意个数异或起来值大于m的方案数。
分析:
动态规划,设dp[i][j] 表示第几次选第i个数的时候异或起来
值为j的方案数。dp[i][j^a[i]]+=dp[i][j];但是对空间有要求
我们可以用滚动数组来写。
代码如下:
题意:
给定n个数,求从中选出任意个数异或起来值大于m的方案数。
分析:
动态规划,设dp[i][j] 表示第几次选第i个数的时候异或起来
值为j的方案数。dp[i][j^a[i]]+=dp[i][j];但是对空间有要求
我们可以用滚动数组来写。
代码如下:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn = 1<<20; typedef long long LL; LL dp[2][maxn]; int a[50]; int main() { int t,n,m,cas=1; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&a[i]); memset(dp,0,sizeof(dp)); LL ans=0; int cnt = 0; dp[0][0]=1; for(int i = 0; i < n; ++i) { memset(dp[cnt^1],0,sizeof(dp[cnt^1])); for(int j = 0; j < maxn; ++j) { int tmp = j^a[i]; dp[cnt^1][tmp] += dp[cnt][j]; dp[cnt^1][j] += dp[cnt][j]; } cnt ^= 1; } for(int i =m;i<maxn;i++) ans+=dp[cnt][i]; printf("Case #%d: %I64d\n",cas++,ans); } return 0; }
相关文章推荐
- 解决android.os.NetworkOnMainThreadException
- Android LayoutInflater原理分析,带你一步步深入了解View(一)
- [UnityShader]Shader上的优化
- android的四种对象引用级别:强、弱、软、虚引用
- Android开机广播android.intent.action.BOOT_COMPLETED
- 【Unity3D】生成工程报错解决—UnityEditor.HostView:OnGUI() Error building Player: Couldn't build player because of unsupported data on target platform.
- Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
- Android自定义控件
- swift down cast
- Android监听电池状态
- Android监听电池状态
- android 关于 android sdk manager 更新,下载慢的问题
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- Android基于socket的群聊程序
- swift type identify 类型检查
- Android APP线程是由谁创建的
- Android项目2之横屏和竖屏切换
- android手写笔思路
- Android笔记之LoopViewPager笔记
- 探索Android该Parcel机制(上)