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个宝石.一旦不能再取宝石就结束.双方都希望自己拿到的宝石数比对方尽可能 ...
随机推荐
- JavaScript解决一个带验证的Form两个Submit事件(一个页面保持不动【AJAX实现】,一个页面提交并跳转)的场景
<form class="form-horizontal" action="/biz/patent/edit" method="post&quo ...
- multer处理post请求的代码演示
let express = require('express'); let multer = require('multer'); let mObj = multer({dest:__dirname+ ...
- 使用非服务器磁盘(MBROnly)安装ESXi时的方法.
From ESXi 5.0, if you install ESXi to a empty hard disk, the target disk will be prepared with GPT-b ...
- mongoose 入门基本操作
简介 Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具 那么要使用它,首先你得装上node.js和mongodb,关于mongodb的安装和操作介绍可以参考:ht ...
- Ionic package Error: Registry returned 404 for GET on
Ionic package Error: Registry returned 404 for GET on https://registry.npmjs.org/org.apache.cordova. ...
- vue实现带规格商品的表格编辑
实现效果: 需求分析: 商品分为 启用规格 和 未启用规格 两种状态, 启用时显示带规格表格, 不启用时显示无规格价格 规格大项最多添加两个, 比如 "颜色", "尺寸& ...
- codeforces431B
Shower Line CodeForces - 431B Many students live in a dormitory. A dormitory is a whole new world of ...
- MySQL中char、varchar和nvarchar的区别
一.char和varchar的区别char是固定长度的,而varchar会根据具体的长度来使用存储空间,另外varchar需要用额外的1-2个字节存储字符串长度.1). 当字符串长度小于255时,用额 ...
- String在内存中如何存储(Java)
JDK1.8中JVM把String常量池移入了堆中,同时取消了“永久代”,改用元空间代替(Metaspace)java中对String对象特殊对待,所以在heap区域分成了两块,一块是字符串常量池(S ...
- String类型的特殊之处
String是一种特殊的引用类型,那么它究竟特殊在哪里? 请看看下面这个程序,输出什么结果? public static void changeStr(String str) { str = &quo ...