HDU - 4901 The Romantic Hero(dp)
https://vjudge.net/problem/HDU-4901
题意
给n个数,构造两个集合,使第一个集合的异或和等于第二个集合的相与和,且要求第一个集合的元素下标都小于第二个集合的元素下标。问方案数
分析
dp来做。dp1[i][j]表示0~i的元素异或和为j的个数。dp2[i][j]表示i~n-1的元素相与和为j的个数。注意状态转移时要同时计算第i个数参与或不参与的情况,且dp1的第一维不能取到n-1,类似的,dp2的第一维不能取0。统计最终答案时需要合并,那么怎么才能防止重复呢?这时再添加dp3[i][j]表示i~n-1的元素相与和为j的个数(i在集合中)。这样枚举i时,就能保证不重复不遗漏了。
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set> #define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define repx(i,x,e) for(int i=(x);i<=(e);i++)
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pd(a) printf("%d\n",a)
#define scl(a) scanf("%lld",&a)
#define scll(a,b) scanf("%lld%lld",&a,&b)
#define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
#define IOS ios::sync_with_stdio(false);cin.tie(0) using namespace std;
typedef long long ll;
template <class T>
void test(T a){cout<<a<<endl;}
template <class T,class T2>
void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
template <class T,class T2,class T3>
void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
const int N = 1e6+;
//const int MAXN = 210;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const ll mod = ;
int T;
void testcase(){
printf("Case #%d: ",++T);
}
const int MAXN = ;
const int MAXM = ;
int dp1[MAXN][MAXN], dp2[MAXN][MAXN], dp3[MAXN][MAXN];
int a[MAXN]; int main(){
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
int T, n, i, j, t;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(i = ; i < n; i++)
scanf("%d",&a[i]);
memset(dp1, , sizeof(dp1));
memset(dp2, , sizeof(dp2));
memset(dp3, , sizeof(dp3));
dp1[][a[]] = ;
for(i = ; i < n - ; i++) {
dp1[i][a[i]]++; //单独一个元素构成一个集合
for(j = ; j < MAXN; j++) {
if(dp1[i-][j]) {
dp1[i][j] += dp1[i-][j]; //不添加第i个元素进行异或,继承之前算好的
dp1[i][j] %= mod; t = j ^ a[i]; //添加第i个元素进行异或
dp1[i][t] += dp1[i-][j];
dp1[i][t] %= mod;
}
}
}
dp2[n-][a[n-]] = ;
dp3[n-][a[n-]] = ;
for(i = n-; i > ; i--) {
dp2[i][a[i]]++;
dp3[i][a[i]]++; //单独一个元素构成一个集合
for(j = ; j < MAXN; j++) {
if(dp2[i+][j]) {
dp2[i][j] += dp2[i+][j]; //不添加第i个元素进行按位与
dp2[i][j] %= mod; t = j & a[i]; //添加第i个元素进行按位与
dp2[i][t] += dp2[i+][j];
dp2[i][t] %= mod; dp3[i][t] += dp2[i+][j]; //添加第i个元素进行按位与
dp3[i][t] %= mod;
}
}
}
int ans = ;
for(i = ; i < n - ; i++) {
for(j = ; j < MAXN; j++) {
if(dp1[i][j] && dp3[i+][j]) {
ans += (ll(dp1[i][j]) * dp3[i+][j] % mod);
ans %= mod;
}
}
}
printf("%d\n", ans); }
return ;
}
HDU - 4901 The Romantic Hero(dp)的更多相关文章
- 2014多校第四场1005 || HDU 4901 The Romantic Hero (DP)
题目链接 题意 :给你一个数列,让你从中挑选一些数组成集合S,挑另外一些数组成集合T,要求是S中的每一个数在原序列中的下标要小于T中每一个数在原序列中下标.S中所有数按位异或后的值要与T中所有的数按位 ...
- HDU 4901(杭电多校训练#3 1005题)The Romantic Hero(DP)
题目地址:HDU 4901 这题没想到最后竟然可以做出来.. .. 这题用了两次DP,先从前往后求一次异或的.再从后往前求一次与运算的. 各自是 1:求异或的时候,定义二维数组huo[1000][10 ...
- HDU 4901 The Romantic Hero (计数DP)
The Romantic Hero 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/E Description There is ...
- HDU 4901 The Romantic Hero(二维dp)
题目大意:给你n个数字,然后分成两份,前边的一份里面的元素进行异或,后面的一份里面的元素进行与.分的时候依照给的先后数序取数,后面的里面的全部的元素的下标一定比前面的大.问你有多上种放元素的方法能够使 ...
- HDU 1864 最大报销额(DP)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1864 题目: 最大报销额 Time Limit: 1000/1000 MS (Java/Others) ...
- HDU 2639 Bone Collector II (dp)
题目链接 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in ...
- HDU 4562 守护雅典娜(dp)
守护雅典娜 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submi ...
- HDU 4901 The Romantic Hero 题解——S.B.S.
The Romantic Hero Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- HDU - 6199 gems gems gems (DP)
有n(2e4)个宝石两个人轮流从左侧取宝石,Alice先手,首轮取1个或2个宝石,如果上一轮取了k个宝石,则这一轮只能取k或k+1个宝石.一旦不能再取宝石就结束.双方都希望自己拿到的宝石数比对方尽可能 ...
随机推荐
- PAT 1008 数组元素循环右移问题
https://pintia.cn/problem-sets/994805260223102976/problems/994805316250615808 一个数组A中存有N(N>0)个整 ...
- Redis交互编程语言及客户端
Redis Desktop Manager https://redisdesktop.com/download Redis Clients https://redis.io/clients/ ...
- Exception while invoking TaskListener: Exception while invoking TaskListener: null
https://community.alfresco.com/thread/225041-exception-while-invoking-tasklistener-null Ok, so the p ...
- docker:Dockerfile构建LNMP平台
docker:Dockerfile构建LNMP平台 1.dockerfile介绍 Dockerfile是Docker用来构建镜像的文本文件,包含自定义的指令和格式.可以通过docker buil ...
- Oracle数据库 查看表是否是 索引组织表的方法
1. 最近在工作过程中发现 一个表插入很慢 以为是索引组织表, 所以一直有点纠结 但是发现 产品里面是没有IOT的 于是找了下公司的OCP 问了下 如何查看 就是 user_tables 视图里面的一 ...
- C1考试科目一知识总结
第二 交通信号 交通信号灯 机动车信号灯(红灯停,路灯走,黄灯等) 车道信号灯(绿色箭头表示该车道通行,红色箭头和红叉表示该车道禁止通行) 方向指示信号灯(红色箭头表示该方向禁止通行,绿色箭头表示该方 ...
- dfs和bfs(链式前向星实现)
dfs代码: #include<iostream>#include<Algorithm>#include<cstring>#include<cstdio> ...
- HihoCoder - 1498 Diligent Robots
There are N jobs to be finished. It takes a robot 1 hour to finish one job. At the beginning you hav ...
- java 按概率产生
import java.util.Random; import org.junit.Test; public class Demo1 { public void getChance(int perce ...
- Oracle Client安装报错:引用数据不可用于验证此操作系统分发的先决条件
原因是Oracle Client 11g版本不支持最新的Win10系统. 打开Oracle Client 11g安装包目录:\client\stage\cvu 编辑该目录下的两个xml文件:oracl ...