3195: [Jxoi2012]奇怪的道路

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

【输入样例1】
3 4 1
【输入样例2】
4 3 3

Sample Output

【输出样例1】
3
【输出样例2】
4

HINT

【数据规模】

100%的数据满足1<= n <= 30, 0 <= m <= 30, 1 <= K <= 8.

【题目说明】

两种可能的连接方法不同当且仅当存在一对城市,它们间的道路数在两种方法中不同。

在交通网络中,有可能存在两个城市无法互相到达。


  可能我的大多数前辈都没有做过这道题,不然应该还是会细细深思的。网上很多题解都没有开滚动,而且开了个四维的数组,空间与时间都多了一个常数k。而POPOQQQ空间上开了三维,时间上却慢了许多。他说:“标解不是这个- - 状态多了一维,代替掉了sta2的枚举,具体做法不大清楚- - 反正比这个快了40倍- -”

  

  我来说说我的想法吧。仨打表的,还是比我强啊。

  我的空间是2*m*2^(k+1)的(2是滚动的),时间是n*(m*2^k+k*m*2^(k+1))的。在网上,我看见大多数空间与时间都多了一个常数k。也可能是我眼拙或是太没有耐心了,没有看见更快的。

  而这不只是空间与时间的区别。我做过的状压题不多,但这道题的实现确实是最简单的。而有一篇博客如是说:“细节特别特别多!!! 要看代码好好思考!!!”也有人说:“因为这道题实现起来有一些复杂,所以是一道当之无愧的好题。”

  这个常数的道理在什么地方?其实想起来也很简单。借用一份题解,谢谢博主SD_le

  第一眼看到题比较裸的状压dp就是f[i][j][s]表示考虑到第i个点,连了j条边,i和i左边k个点奇偶性状态为s的方案数,然后枚举i和谁连边向j+1转移,每个s再向i+1转移。

  写完后发现这个做法有bug,因为同一个状态因为i向外连边的顺序不同而被重复记数了。比如:

  

  第一个状态就在第四个状态中被重复记了两次,所以我们在加一位状态l,表示i正准备和i-l连边,这样i的边就是从左往右连的,就不会重复记数了。

  只要知道状压是什么(PS:我当然知道啊不就是状态压缩类动态规划吗),应该是很好列出来三维对应的含义的。但是,当你真正做出来时,也常常会发现上述的那个bug。有可能从一点i连到前面那几个点的边发生了重复。这就看上去很不清真了。但是,当对DP的认识上升到了沿拓扑序转移状态这样的“境界”时,你就会发现,i连向相同一个点的边就很像背包问题中的一件物品,每一件物品都是不限量的(只是最终要求了奇偶)。想一想,我们的完全背包统计方案时并没有多开一维,但绝对不会重复计数的。原因很简单,在做背包问题时,各个物品的选取存在严格顺序,不存在“选了几个物品a,又选了一点别的,再去选了几个物品a”的情况。只要能想到这里,如何解决就不是很难了。应当严格区分出各个物品,在每一个物品内部进行顺推(因为是完全背包)。

 /**************************************************************
Problem: 3195
User: Doggu
Language: C++
Result: Accepted
Time:68 ms
Memory:960 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#include <algorithm>
const int M = + ;
const int K = ;
const int MOD = 1e9+;
int n, m, k, f[][M][<<K], cur, lm, lim, pow[K];
inline void add(int &a,int b) {a=a-MOD+b>?a-MOD+b:a+b;}
int main() {
scanf("%d%d%d",&n,&m,&k);pow[]=;for( int i = ; i <= k; i++ ) pow[i]=pow[i-]<<;
f[cur][][]=;lim=<<(k+);lm=<<k;
for( int i = ; i <= n; i++ ) {
cur^=;memset(f[cur],,sizeof(f[cur]));
for( int j = ; j <= m; j++ ) for( int st = ; st < lm; st++ ) f[cur][j][st<<]=f[cur^][j][st];
int bound=std::min(k,i-);for( int bit = ; bit <= bound; bit++ ) for( int j = ; j < m; j++ ) for( int st = ; st < lim; st++ ) add(f[cur][j+][st^^pow[bit]],f[cur][j][st]);
}
printf("%d\n",f[cur][m][]);
return ;
}

3195

bzoj 3195 [Jxoi2012]奇怪的道路的更多相关文章

  1. BZOJ 3195 [Jxoi2012]奇怪的道路 | 状压DP

    传送门 BZOJ 3195 题解 这是一道画风正常的状压DP题. 可以想到,\(dp[i][j][k]\)表示到第\(i\)个点.已经连了\(j\)条边,当前\([i - K, i]\)区间内的点的度 ...

  2. BZOJ 3195: [Jxoi2012]奇怪的道路(状压dp)

    f[i][j][s]表示当前处理第i个点,前i-1个点已连j条边,第i个点开始k个点的奇偶性状态. #include<cstring>#include<algorithm>#i ...

  3. 【BZOJ】3195: [Jxoi2012]奇怪的道路【状压/奇偶性】【思路】

    3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 802  Solved: 529[Submit][Statu ...

  4. 3195: [Jxoi2012]奇怪的道路

    3195: [Jxoi2012]奇怪的道路 链接 思路: 因为一个点只会和它前后k个点连边,所以,记录下每个点的前k个点和它自己(共k+1个点)的状态,1表示奇数,0表示偶数. dp[i][j][s] ...

  5. [BZOJ3195][Jxoi2012]奇怪的道路

    3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec  Memory Limit: 128 MB Description 小宇从历史书上了解到一个古老的文明.这个文明在各个 ...

  6. [补档][Jxoi2012] 奇怪的道路

    [Jxoi2012] 奇怪的道路 题目 传送门 :http://www.lydsy.com/JudgeOnline/problem.php?id=3195 小宇从历史书上了解到一个古老的文明.这个文明 ...

  7. 【BZOJ3195】[Jxoi2012]奇怪的道路 状压DP

    [BZOJ3195][Jxoi2012]奇怪的道路 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座 ...

  8. 【BZOJ 3195 】[Jxoi2012]奇怪的道路 装压dp

    受惯性思维的影响自动把二进制状态认为是连与不连......... 我们这里二进制状态表示的是奇偶,这样的话我们f[i][j][k]表示的就是前i个城市用了j个边他前k个城市的奇偶状态,然后想想怎么转移 ...

  9. BZOJ3195:[JXOI2012]奇怪的道路——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3195 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方 ...

随机推荐

  1. Java基础—线程

    推荐阅读:http://www.iteye.com/topic/806990 一.起手式——基本概念 1.什么叫线程 进程:进行中的程序:作为资源分配的单位. 线程:轻量级的进程:程序里的顺序控制流, ...

  2. Django Rest Framework源码剖析(三)-----频率控制

    一.简介 承接上篇文章Django Rest Framework源码剖析(二)-----权限,当服务的接口被频繁调用,导致资源紧张怎么办呢?当然或许有很多解决办法,比如:负载均衡.提高服务器配置.通过 ...

  3. typedef你真的理解么?

    typedef,用最简单的话去诠释他,那么就是给类型取别名!!!  但是他并没有你想象的那么简单! 举例: typedef int size;//那么int就有一个别名叫size了,以后就可以 siz ...

  4. LNMP环境中WordPress程序伪静态解决方案

    LNMP环境是目前我们国内站长使用的Linux VPS配置环境中使用较多的.作为新手我们很可能会看到老左类似的"LNMP安装教程"然后依葫芦画瓢的去安装VPS.我们是否有发现环境中 ...

  5. 【ORACLE】oracle11g dg搭建

    --------------------------------每个节点和DG------------------------------------------------------------- ...

  6. Asp.Net_HttpModule的应用

    IHttpModule向实现类提供模块初始化和处置事件. IHttpModule包含兩個方法: public void Init(HttpApplication context);public voi ...

  7. 阿里云ESC入网和出网指的什么

    什么是入网带宽和出网带宽 云服务器 ECS 的入网带宽和出网带宽皆以服务器角度出发.下表给出了入网带宽和出网带宽的具体内容: 带宽类别 (Mbit/s) 描述 入网带宽 流入云服务器 ECS 的带宽从 ...

  8. ABP中文文档及源码说明

    目录 ABP.ModuleZero(ABP自带的一套用户模块) 版本管理(Edition) 特性管理(Feature)

  9. Fabric Dev开发调试模式的搭建过程

    在利用Fabric开发Chaincode的时候,调试Chaincode显得尤为不方便,因为Chaincode正常应该运行在Docker容器中,每次修改Chaincode后想要使其更改生效必须得对Cha ...

  10. 毕业设计---json,Struts,ajax以及JQuery简单案例

    <!-- Struts2的xml文件配置 --><struts> <package name="default" namespace="/& ...