HDU4901 The Romantic Hero 计数DP
2014多校4的1005
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4901
The Romantic HeroTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 393 Accepted Submission(s): 150 Problem Description
There is an old country and the king fell in love with a devil. The devil always asks the king to do some crazy things. Although the king used to be wise and beloved by his people. Now he is just like a boy in love and can’t refuse any request from the devil. Also, this devil is looking like a very cute Loli.
You may wonder why this country has such an interesting tradition? It has a very long story, but I won't tell you :). Let us continue, the party princess's knight win the algorithm contest. When the devil hears about that, she decided to take some action. But before that, there is another party arose recently, the 'MengMengDa' party, everyone in this party feel everything is 'MengMengDa' and acts like a 'MengMengDa' guy. While they are very pleased about that, it brings many people in this kingdom troubles. So they decided to stop them. Our hero z*p come again, actually he is very good at Algorithm contest, so he invites the leader of the 'MengMengda' party xiaod*o to compete in an algorithm contest. As z*p is both handsome and talkative, he has many girl friends to deal with, on the contest day, he find he has 3 dating to complete and have no time to compete, so he let you to solve the problems for him. And the easiest problem in this contest is like that: There is n number a_1,a_2,...,a_n on the line. You can choose two set S(a_s1,a_s2,..,a_sk) and T(a_t1,a_t2,...,a_tm). Each element in S should be at the left of every element in T.(si < tj for all i,j). S and T shouldn't be empty. And what we want is the bitwise XOR of each element in S is equal to the bitwise AND of each element in T. How many ways are there to choose such two sets? You should output the result modulo 10^9+7. Input
The first line contains an integer T, denoting the number of the test cases. For each test case, the first line contains a integers n. The next line contains n integers a_1,a_2,...,a_n which are separated by a single space.
n<=10^3, 0 <= a_i <1024, T<=20. Output
For each test case, output the result in one line.
Sample Input
2
3 1 2 3 4 1 2 3 3 Sample Output
1
4 Author
WJMZBMR
Source
Recommend
|
题意:
给一列数,让你选两个集合,A集合所有元素下标小于B集合所有元素下标,A集合的所有元素异或等于B集合所有元素AND,两个集合都非空,求集合元素有多少种选法,MOD 10^9+7。0<=元素大小<1024,最多1000个元素。
题解:
DP!(虽然我一开始就想到DP,不过我DP功力太差,比赛中实在做不出,结束后看了http://www.cnblogs.com/avema/p/3881466.html的超快题解(虽然没写题解只有代码)才学会的)
官方题解居然是这样的“水题,大家都会做吧?”我都怕了!虽然很多人过了,好像的确很水的样子……
言归正传,我来讲一下这个DP。
f[i][j]:由0~i的元素异或得到j的种类数。
h[i][j]:由i~n-1的元素AND得到j的种类数。
g[i][j]:由i~n-1的元素,且一定包含i,AND得到j的种类数。
求出这些,最后把f[i][j]*g[i+1][j]求和就得到答案了!
这里用g而不用h,防止重复计数,非常高端。我写的时候也一直在考虑防止重复计数,结果写出来4重循环,我自己都怕,看来是我对DP的理解不够深。这个只用两重循环,快得飞起来。具体实现看代码吧,还算比较简单易懂。
代码:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<math.h> #define ll __int64
#define usint unsigned int
#define mz(array) memset(array, 0, sizeof(array))
#define RE freopen("1.in","r",stdin)
#define WE freopen("mask.txt","w",stdout) #define maxa 1024
#define maxn 1000
#define C 1000000007 int f[maxn-][maxa],g[maxn][maxa],h[maxn][maxa]; int main() { int a[maxn],T,n;
short i,j,t;
int ans;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(i=; i<n; i++)
scanf("%d",&a[i]);
mz(f);
mz(g);
mz(h);
f[][a[]]=;
for(i=; i<n-; i++) {
f[i][a[i]]++;///单独一个元素的集合的情况
for(j=; j<maxa; j++) {
if(f[i-][j]) {
f[i][j]+=f[i-][j];///继承之前算好的情况(就是 不包括当前元素的情况)
f[i][j]%=C;
t=j^a[i];
f[i][t]+=f[i-][j];///由前一次的情况异或当前元素得到的情况(包括当前元素的情况)
f[i][t]%=C;
} }
} g[n-][a[n-]]=;
h[n-][a[n-]]=;
for(i=n-; i>; i--) {
g[i][a[i]]++;
h[i][a[i]]++;
for(j=; j<maxa; j++) {
if(h[i+][j]) {
h[i][j]+=h[i+][j];
h[i][j]%=C;
t=j&a[i];
h[i][t]+=h[i+][j];
h[i][t]%=C; g[i][t]+=h[i+][j];///包括当前元素的情况(g没有不包括当前元素的情况)
g[i][t]%=C;
} }
}
ans=;
for(i=; i<n-; i++)
for(j=; j<maxa; j++) {
if(f[i][j]&&g[i+][j]) {
ans+=(((ll)f[i][j])*(g[i+][j])%C);
ans%=C;
}
}
printf("%d\n",ans);
}
return ;
}
这次来个C的代码,酷不酷炫(其实没有类都可以换成C的吧
HDU4901 The Romantic Hero 计数DP的更多相关文章
- HDU - 4901 The Romantic Hero(dp)
https://vjudge.net/problem/HDU-4901 题意 给n个数,构造两个集合,使第一个集合的异或和等于第二个集合的相与和,且要求第一个集合的元素下标都小于第二个集合的元素下标. ...
- 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 4901 The Romantic Hero 题解——S.B.S.
The Romantic Hero Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- HDOJ 4901 The Romantic Hero
DP....扫两次合并 The Romantic Hero Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 ...
- HDU 4901 The Romantic Hero
The Romantic Hero Time Limit: 3000MS Memory Limit: 131072KB 64bit IO Format: %I64d & %I64u D ...
- HDU5800 To My Girlfriend 背包计数dp
分析:首先定义状态dp[i][j][s1][s2]代表前i个物品中,选若干个物品,总价值为j 其中s1个物品时必选,s2物品必不选的方案数 那么转移的时候可以考虑,第i个物品是可选可可不选的 dp[i ...
随机推荐
- Linux 基础入门
实验一(Linux 系统简介): 了解了一些有关Linux的重要人物,以及 实验二(基本概念及操作): Linux终端 1.Terminal(终端):当你切换到其中一个终端后想要切换回图形界面,你可以 ...
- Windows的Subversion备份脚本
2015-12-08更新:备份时添加--revision head 只备份最新的版本,已从脚本中移除. 2013-12-09更新:forfiles命令添加错误输出日志. 2013-12-04更新:添加 ...
- Win10/UWP开发—使用Cortana语音指令启动前台App
这两天进群(53078485)找大咖的童鞋比较多,只是大咖比较忙,目前Demo还没有要到,这里先给大家转载一篇Aran大咖的博客学习下,以下是原文: Win10开发中最具有系统特色的功能点绝对少不了集 ...
- 疯狂的Java算法——插入排序,归并排序以及并行归并排序
从古至今的难题 在IT届有一道百算不厌其烦的题,俗称排序.不管是你参加BAT等高端笔试,亦或是藏匿于街头小巷的草根笔试,都会经常见到这样一道百年难得一解的问题. 今天LZ有幸与各位分享一下算法届的草根 ...
- 怎样将SQL Azure数据库备份到本地或者Storage
怎样备份SQL Azure数据库到本地或者云存储Storage,可以使用SQL Database Import Export 的功能. 具体操作如下: 用SSMS链接SQL Azure数据库 注意:服 ...
- java中的File类
File类 java中的File类其实和文件并没有多大关系,它更像一个对文件路径描述的类.它即可以代表某个路径下的特定文件,也可以用来表示该路径的下的所有文件,所以我们不要被它的表象所迷惑.对文件的真 ...
- [AaronYang]C#人爱学不学[3]
本文章不适合入门,只适合有一定基础的人看.我更相信知识细节见高低,我是从4.0开始学的,终于有时间系统的学习C#5.0,是5.0中的知识,会特殊标记下.但写的内容也可能含有其他版本framework的 ...
- OC基础--内存管理中的@property关键字以及其参数
在上一篇博客中整理的内存管理,管理类的代码量会感觉很大,而且如果对象多的话,感觉到代码有点冗余.下面就介绍Xcode中为我们自动生成内存管理代码的关键字@property 例如:在Person这个类中 ...
- Pro Git 读书笔记
一. 起步 1. 集中式版本控制缺点:中央服务器的单点故障. 分布式版本控制优点:客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来. 这么一来,任何一处协同工作用的服务器发生故障,事后 ...
- .net架构设计读书笔记--第二章 设计体系结构
第五节 探索领域架构 一.领域驱动设计的价值与意义 最初在java中使用,.net要晚些才引入.领域驱动设计出现之初的争议.一个向导,少走弯路 1. 我们真的需要DDD吗? DDD并不适用于每个软 ...