或与异或 [背包DP]
\(\mathcal{Description}\)
给定\(n\)和长度为\(n\)的数组\(a\)
问从\(a\)中选取任意个数使得其 异或起来的值 等于 或起来的值 的方案数
\(n\leq 50,a_i\leq 2^{13}\)
\(\mathcal{Solution}\)
考虑枚举最终答案是什么,即最后或起来的值是什么
这样是\(2^{13}\)的复杂度
之后把这个值的子集求出来,这是\(2^s\)的复杂度
把合法的\(a\)提出来
设\(f_{i,j}\)表示前\(i\)个数异或起来为\(j\)的方案数,直接做背包\(DP\)即可
设枚举到的答案是\(s\),\(DP\)的复杂度为\(n*2^s\)
总复杂度为\(\sum\limits_{i=1}^{13}\begin{pmatrix}n\\i\end{pmatrix}2^i*n=n\sum\limits_{i=1}^{13}\begin{pmatrix}n\\i\end{pmatrix}2^i*1^{n-i}=n\left(2+1\right)^{13}=3^{13}n\)
\(\mathcal{Code}\)
/*******************************
Author:Morning_Glory
LANG:C++
Created Time:2019年10月28日 星期一 14时27分41秒
*******************************/
#include <cstdio>
#include <fstream>
#define ll long long
using namespace std;
const int maxn = 55;
const int maxm = 16485;
//{{{cin
struct IO{
template<typename T>
IO & operator>>(T&res){
res=0;
bool flag=false;
char ch;
while((ch=getchar())>'9'||ch<'0') flag|=ch=='-';
while(ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch^'0'),ch=getchar();
if (flag) res=~res+1;
return *this;
}
}cin;
//}}}
int n,S,cnt,tot;
int a[maxn],s[maxm],v[maxn];
ll ans;
ll f[maxn][maxm];
int main()
{
cin>>n;
for (int i=1;i<=n;++i) cin>>a[i];
S=(1<<14)-1;
for (int i=1;i<=S;++i){
cnt=tot=0;
for (int j=i;j;j=(j-1)&i) s[++cnt]=j;
s[++cnt]=0;
for (int j=1;j<=n;++j)
if ((a[j]|i)==i) v[++tot]=a[j];
f[0][0]=1;
for (int j=1;j<=tot;++j)
for (int k=1;k<=cnt;++k) f[j][s[k]]=f[j-1][s[k]^v[j]]+f[j-1][s[k]];
ans+=f[tot][i];
}
printf("%lld\n",ans);
return 0;
}
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
或与异或 [背包DP]的更多相关文章
- 树形DP和状压DP和背包DP
树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...
- 【bzoj3687】简单题 背包dp+STL-bitset
题目描述 小呆开始研究集合论了,他提出了关于一个数集四个问题:1.子集的异或和的算术和.2.子集的异或和的异或和.3.子集的算术和的算术和.4.子集的算术和的异或和.目前为止,小呆已经解决了前三个问题 ...
- 复习1背包dp
背包问题是对于一个有限制的容器,一般计算可以装的物品的价值最值或数量.通常每个物品都有两个属性空间和价值,有时还有数量或别的限制条件,这个因体而异. 背包大概分成3部分,下面会细述这最经典的3种题型 ...
- HDU 5119 Happy Matt Friends (背包DP + 滚动数组)
题目链接:HDU 5119 Problem Description Matt has N friends. They are playing a game together. Each of Matt ...
- 背包dp整理
01背包 动态规划是一种高效的算法.在数学和计算机科学中,是一种将复杂问题的分成多个简单的小问题思想 ---- 分而治之.因此我们使用动态规划的时候,原问题必须是重叠的子问题.运用动态规划设计的算法比 ...
- hdu 5534 Partial Tree 背包DP
Partial Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- HDU 5501 The Highest Mark 背包dp
The Highest Mark Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- Codeforces Codeforces Round #319 (Div. 2) B. Modulo Sum 背包dp
B. Modulo Sum Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/577/problem/ ...
- noj [1479] How many (01背包||DP||DFS)
http://ac.nbutoj.com/Problem/view.xhtml?id=1479 [1479] How many 时间限制: 1000 ms 内存限制: 65535 K 问题描述 The ...
随机推荐
- GitHub 手把手教你如何把本地项目或代码提交到Github托管
GitHub 手把手教你如何把项目或代码提交到Github托管 启动Git Bash命令行 重点内容 1.首先打开你的github,点击新建项目,点击new repositories ,然后直接给项目 ...
- Spark 部署即提交模式意义解析
Spark 的官方从 Cluster Mode Overview 中,官方向我们介绍了 cluster 模式的部署方式. Spark 作为独立进程在集群上运行,他们通过 SparkContext 进行 ...
- C++ STL(标准模板库)的学习了解
C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以 ...
- ~/.ssh/config文件的使用
Host github-A HostName github.com User git IdentityFile /Users/xxx/.ssh/id_rsa_A IdentitiesOnly yes ...
- 【转】目前为止最透彻的的Netty高性能原理和框架架构解析
转自:https://zhuanlan.zhihu.com/p/48591893 1.引言 Netty 是一个广受欢迎的异步事件驱动的Java开源网络应用程序框架,用于快速开发可维护的高性能协议服务器 ...
- java命名总结
下文主要来源于网上,我做了一些编辑整理. “如果你不知道一件事物叫什么, 你就不知道它是什么. 如果你不知道这是什么, 你就不可能坐下来写代码.” ----萨姆·加德纳(Sam Gardiner) 1 ...
- ubuntu16.04 overlay 不支持redirect_dir开关
modinfo overlay--查看overlay版本 通过linux网站--https://elixir.bootlin.com/linux/v4.4.196/source/fs/overlayf ...
- 试图从目录中执行 CGI、ISAPI 或其他可执行程序
首先来看我遇到问题时的情况,直接上图! 从上图的错误提示信息可以看出,是权限不够,被拒绝访问,开始我以为是我的程序的php程序的原因,但是其他站点没事啊,就对这个站点的权限重新分配了下,给了最高权 ...
- canvas笔记备忘
备忘 1. canvas标签的宽和高设置是标签属性设置, 不是 css 属性设置. 如果用 css 属性设置大小, canvas 会被拉伸. 标签属性例如: class, id, style, wid ...
- Scheduling In Go
https://www.ardanlabs.com/blog/2018/08/scheduling-in-go-part1.html https://blog.altoros.com/golang-i ...