我觉得这个DP挺难的。。。然而这只是lydrainbowcat学长幻灯片上的第一题……

明天考试要GG。

题意:

给你一个序列,让你选出两个集合S和T。保证S里的数都在T里的数的左边。求一共有多少个集合满足S的异或所得等于T的与的所得,并mod一个大素数。

思路:

上课讲的DP,可惜我写了一晚上。。。。。。

首先我们可以枚举断点。i

这样就把序列分成了两部分。

前半部分是集合S

可以进行DP

j表示前i个数xor得j的方案数

f[i][j]=(f[i-1][j]+f[i-1][j*a[i]])%mod

(上一个状态和a[i]进行异或操作)

后半部分是集合T

也可以进行DP

j表示进行与操作得j的方案数

d[i][j]=d[i+1][j]

(显然,如果上一个状态可以到j,这个状态也可以)

d[i][j]=d[i+1][j],d[i][j&a[i]]=(d[i+1][j]+d[i][j&a[i]])%mod;

(上一个状态和a[i]进行位与操作)

所以 ans=((long long)f[i-1][j^a[i]]*d[i+1][j]+ans)%mod;

(要有强制类型转换)

// by SiriusRen
#include <bits/stdc++.h>
#define F for(int j=0;j<1024;j++)
using namespace std;
int cases,n,a[1001],f[1001][1025],d[1001][1025],mod=1e9+7,ans;
int main(){
scanf("%d",&cases);
while(cases--){
memset(f,0,sizeof(f)),memset(d,0,sizeof(d)),ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),d[i][a[i]]++;
f[0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<1024;j++)f[i][j]=(f[i-1][j^a[i]]+f[i-1][j])%mod;
for(int i=n-1;i>=1;i--){
F d[i][j]=d[i+1][j],d[i][j&a[i]]=(d[i+1][j]+d[i][j&a[i]])%mod;
d[i][a[i]]++;
F ans=((long long)f[i-1][j^a[i]]*d[i+1][j]+ans)%mod;
}
printf("%d\n",ans);
}
}

一不小心还刷了Code Length的第一。

HDU 4901 DP的更多相关文章

  1. HDU 4901(杭电多校训练#3 1005题)The Romantic Hero(DP)

    题目地址:HDU 4901 这题没想到最后竟然可以做出来.. .. 这题用了两次DP,先从前往后求一次异或的.再从后往前求一次与运算的. 各自是 1:求异或的时候,定义二维数组huo[1000][10 ...

  2. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  3. HDU 5928 DP 凸包graham

    给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...

  4. 2014多校第四场1005 || HDU 4901 The Romantic Hero (DP)

    题目链接 题意 :给你一个数列,让你从中挑选一些数组成集合S,挑另外一些数组成集合T,要求是S中的每一个数在原序列中的下标要小于T中每一个数在原序列中下标.S中所有数按位异或后的值要与T中所有的数按位 ...

  5. hdu 4901 The Romantic Hero (dp)

    题目链接 题意:给一个数组a,从中选择一些元素,构成两个数组s, t,使s数组里的所有元素异或 等于 t数组里的所有元素 位于,求有多少种构成方式.要求s数组里 的所有的元素的下标 小于 t数组里的所 ...

  6. HDU 4901 The Romantic Hero(二维dp)

    题目大意:给你n个数字,然后分成两份,前边的一份里面的元素进行异或,后面的一份里面的元素进行与.分的时候依照给的先后数序取数,后面的里面的全部的元素的下标一定比前面的大.问你有多上种放元素的方法能够使 ...

  7. HDU - 4901 The Romantic Hero(dp)

    https://vjudge.net/problem/HDU-4901 题意 给n个数,构造两个集合,使第一个集合的异或和等于第二个集合的相与和,且要求第一个集合的元素下标都小于第二个集合的元素下标. ...

  8. HDU 4901 多校4 经典计数DP

    RT 最近不想写博客,累积了一周多的题目,今天趁着周日放假,全部补上吧 dp[i][j]表示前i个数,操作后的值为j的总个数 注意取或不取,有种完全背包的意味.因为数字小于1024,所以异或的结果也绝 ...

  9. HDU 4901 The Romantic Hero (计数DP)

    The Romantic Hero 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/E Description There is ...

随机推荐

  1. 学生成绩管理系统C(链表)语言

    #include"stdio.h" #include"stdlib.h" #include"string.h" //用于调用一些函数 str ...

  2. 7-19 求链式线性表的倒数第K项

    7-19 求链式线性表的倒数第K项(20 分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示 ...

  3. C#关键字详解第四节

    位 Unicode 字符 char在C#中与C语言不同,他表示的是16位无符号进制的数,在计算机中他是被用来存储字符但是他只能用来存 储一个文字,与string不同string可以存储多个文字或字符, ...

  4. 解析 XML 数据

    在几个月前我有做过这样的记录,其目的是避免解析 XML 时手工编写太多的代码,造成重复的体力劳动.后来经过一番资料的查找,我发现其实并没有必要做这样的工具,因为 C# 已经为我们提供了更好的解决方案了 ...

  5. BUPT2017 wintertraining(15) #9

    下面不再说明题意了请自行读题,直接放contest链接. https://vjudge.net/contest/151607 A.考虑当火车隔k站一停时 区间长度 >= k 的纪念品一定能买到 ...

  6. zookeeper概念与原理

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. 1 Zookeeper的基本概念 1.1 角色 ...

  7. 牛刀小试MySQL学习—MySQL 双主

    双主其实说白了也是一个replication,只是推出一些新的拓扑结构   主-主的复制有两种模式: 主动-主动模式下的主-主复制(Master-Master in Active-Active Mod ...

  8. 洛谷 P2827 BZOJ 4721 UOJ #264 蚯蚓

    题目描述 本题中,我们将用符号表示对c向下取整,例如:. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现在共有n只蚯蚓(n为正整数).每只 ...

  9. 同开三本DJANGO,需要提升一下本职工作的能力啦

    慢慢将一些概念固化到基因内,才有可能和SPRING MVC,MEAN之类的好好作比较吧. 全都是基于1.8版本的教材,爽!!!

  10. [poj3070]Fibonacci_矩乘_快速幂

    Fibonacci poj-3070 题目大意:求Fibonacci第n项. 注释:模数为10000,$1\le n \le 10^9$. 想法:矩阵题,用例题6的想法,我们构造矩阵 $\begin{ ...