[BZOJ3195][Jxoi2012]奇怪的道路
3195: [Jxoi2012]奇怪的道路
Time Limit: 10 Sec Memory Limit: 128 MB
Description
小宇从历史书上了解到一个古老的文明。这个文明在各个方面高度发达,交通方面也不例外。考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n。m条道路连接在这些城市之间,每条道路将两个城市连接起来,使得两地的居民可以方便地来往。一对城市之间可能存在多条道路。
据史料记载,这个文明的交通网络满足两个奇怪的特征。首先,这个文明崇拜数字K,所以对于任何一条道路,设它连接的两个城市分别为u和v,则必定满足1 <=|u - v| <= K。此外,任何一个城市都与恰好偶数条道路相连(0也被认为是偶数)。不过,由于时间过于久远,具体的交通网络我们已经无法得知了。小宇很好奇这n个城市之间究竟有多少种可能的连接方法,于是她向你求助。
方法数可能很大,你只需要输出方法数模1000000007后的结果。
Input
输入共一行,为3个整数n,m,K。
Output
输出1个整数,表示方案数模1000000007后的结果。
Sample Input
3 4 1
【输入样例2】
4 3 3
Sample Output
3
【输出样例2】
4
HINT
100%的数据满足1<= n <= 30, 0 <= m <= 30, 1 <= K <= 8.
【题目说明】两种可能的连接方法不同当且仅当存在一对城市,它们间的道路数在两种方法中不同。在交通网络中,有可能存在两个城市无法互相到达。
题解:
考试的时候我真的没有想到……看到了数据范围比较小,但是我想的是深搜而不是状压……
我们发现k的数据范围很小,所以我们考虑状压,首先考虑状态数组定义。
首先,f数组肯定有2维表示枚举到的点数和边数。我们发现,题目中对每个点的奇偶性有限制,而奇偶是两种相反的概念,
因此我们尝试再用一位表示可以和这个点连边的点的出度奇偶性状态,1表示奇;但是我们发现,如果这个设置为所有它能转移到的点的奇偶性(一共16位),
不仅时间复杂度变大,转移时候的讨论也会很复杂,而我们考虑一下,其实只弄一边的状态就可以了,从现在的点往后转移相当于从后面的点往前转移
因此我们只保存i点以及前面k个点的状态即可,我们再设置一维l,表示我们已经考虑到了前面k+1个点中的第l个点(我们设高位离着i点最近,第0位是点i-k,第k位是i点,一共k+1位)
于是我们得到了一个四维的状态数组,f[35][35][(1<<9)[10],接下来我们考虑转移
考虑对第i-k+l个点与第i个点,如果我们不再加边,就直接转移到下一个f[i][j][state][l+1]
如果我们再还合法的情况下加边,会同时改变i点和i-k+l这两个的出度奇偶性,也就是转移到f[i][j+1][state^(1<<k)^(1<<l)][l]
然后我们考虑不同i之间的转移。如果当前状态要转移的话,我们现在第i-k个点永远不会再被考虑,因此转移的前提之一是第i-k位奇偶性是0,即state&1==0
并且,我们还可以发现一个很有用的性质:对于点i+1,它初始state就是第i个点的state>>1,这一点很显然,从我们第3维的定义中就能看出这一操作可以实现
这样的话,就有跨第一维的转移,即向f[i+1][j][u>>1][0]转移
再最后的时候,输出f[n+1][m][0][0]即可,代码见下:
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const LL mod=;
int n,m,k,bin[],f[][][(<<)+][];
int main()
{
scanf("%d%d%d",&n,&m,&k);
bin[]=;for(int i=;i<=;i++)bin[i]=bin[i-]<<;
f[][][][]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int u=;u<bin[k+];u++)
{
for(int l=;l<k;l++)
if(f[i][j][u][l])
{
(f[i][j][u][l+]+=f[i][j][u][l])%=mod;
if(j<m&&i-k+l>)
(f[i][j+][u^bin[k]^bin[l]][l]+=f[i][j][u][l])%=mod;
}
if((u&)==&&f[i][j][u][k])
f[i+][j][u>>][]=f[i][j][u][k];
}
printf("%d",f[n+][m][][]);
}
[BZOJ3195][Jxoi2012]奇怪的道路的更多相关文章
- BZOJ3195: [Jxoi2012]奇怪的道路【状压DP】
Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n.m条道路连接在这些城市之间,每 ...
- bzoj3195: [Jxoi2012]奇怪的道路(状压dp)
Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编号为1..n.m条道路连接在这些城市之间,每 ...
- 2018.10.24 bzoj3195: [Jxoi2012]奇怪的道路(状压dp)
传送门 f[i][j][k]f[i][j][k]f[i][j][k]表示前iii个点连了jjj条边,第i−K+1i-K+1i−K+1~iii个点连边数的奇偶性为kkk时的方案数. 转移规定只能从后向前 ...
- bzoj3195 [Jxoi2012]奇怪的道路——状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3195 看到数据范围就应该想到状压呢... 题解(原来是这样):https://www.cnb ...
- 【BZOJ3195】[Jxoi2012]奇怪的道路 状压DP
[BZOJ3195][Jxoi2012]奇怪的道路 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座 ...
- 【BZOJ-3195】奇怪的道路 状压DP (好题!)
3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 305 Solved: 184[Submit][Statu ...
- [补档][Jxoi2012] 奇怪的道路
[Jxoi2012] 奇怪的道路 题目 传送门 :http://www.lydsy.com/JudgeOnline/problem.php?id=3195 小宇从历史书上了解到一个古老的文明.这个文明 ...
- bzoj 3195 [Jxoi2012]奇怪的道路
3195: [Jxoi2012]奇怪的道路 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编 ...
- 【BZOJ】3195: [Jxoi2012]奇怪的道路【状压/奇偶性】【思路】
3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 802 Solved: 529[Submit][Statu ...
随机推荐
- Maven学习(七)-----Maven添加远程仓库
Maven添加远程仓库 默认情况下,Maven从Maven中央仓库下载所有依赖关系.但是,有些库丢失在中央存储库,只有在Java.net或JBoss的储存库远程仓库中能找到. 1. Java.net资 ...
- ----------BMI指数小程序----------
# 1.创建并输出菜单, 菜单是不可变的. 所以使用元组# menus = ("1, 录入", "2, 查询", "3, 删除", &quo ...
- 基于Spring的最简单的定时任务实现与配置(三)--番外篇 cron表达式的相关内容
本来这篇文章是会跟本系列的前两篇文章一起发布的.但是,昨天在找资料总结的时候遇到了一点意外,就延后了一些. 本篇的内容主要参考了 这篇博文:http://www.cnblogs.com/junrong ...
- dalao自动报表邮件2.0
经过昨天的修改优化后,dalao收到了不是“木马”的邮件,欣慰地点了点头,“不错,不错,这几张表设计的简洁明了,看着有货!不过呀,,,这些表的数据太多了一点,十几天的数据一大溜,能不能再简洁一点,做一 ...
- NO.06--聊一聊“币”吧!
近期博主更新的频率明显慢来 ,一来是最近的工作比较忙碌,几个项目几乎同时要上线.二来是在思考是不是把我平时生活中的一些事情写进来博客,不只是分享分享技术. 趁着区块链.比特币火爆,博主也算是略有涉猎, ...
- EXE模块说明
EXE模块是fastCMS系统内非常优秀的一个功能模块,它将一些操作打包成可执行单元.它具有以下优势: 1)功能明确.便于维护. 2)发起端可获取EXE模块的执行结果. 3)对于不需要执行结果的请求, ...
- Saving James Bond - Easy Version (MOOC)
06-图2 Saving James Bond - Easy Version (25 分) This time let us consider the situation in the movie & ...
- join 中的on和where的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表, 然后再将这张临时表返回给用户. 在使用left jion时,on和where条件的区别如下: 1.on条件是在生成临时表时使用的条 ...
- 从零开始的Python学习Episode 8——深浅拷贝
深浅拷贝 一.浅拷贝 列表中存储的是数据的内存地址,当我们要查询或修改列表中的数据时,我们是通过列表中的地址找到要访问的内存.当我们修改列表中的数据时,如果修改的是一个不可变类型(整型,长整型,浮点数 ...
- dp算法之硬币找零问题
题目:硬币找零 题目介绍:现在有面值1.3.5元三种硬币无限个,问组成n元的硬币的最小数目? 分析:现在假设n=10,画出状态分布图: 硬币编号 硬币面值p 1 1 2 3 3 5 编号i/n总数j ...