题解 [JXOI2012]奇怪的道路
考场上我坚持认为这是个组合数题。。。
看到\(k\leq8\)我想状压来着,但是不知道怎么压
实际上,对于点i和点j的连边(\(j\in[i-k, i-1]\))只有连或不连两种状态
而如果i与比j编号小的点连边的情况已经考虑完了,方案数就可以连带下来,如此就可以建立转移
令\(dp[i][j][s][l]\)为在点i,连了j条边,点i-k到点i之间的点已连边数的奇偶性压成s,此时从前向后连带到第\(i-k+l\)个点
i与每个点都是连或不连两种状态,则正序枚举l,使\(dp[i][j][s][max(0, k-i)]\)为初始状态
则连带过程:
\(dp[i][j][s][l+1] += dp[i][j][s][l]\) (i与j不连边)
\(dp[i][j+1][s^(1<<(k-l))^1][l] += dp[i][j][s][l]\) (i与j连边)
注意这里\(l\in[0, k-1]\),但为了方便写成了\(l\in[0, k]\),
当\(i==k\)时考虑从第i个点转移到第i+1个点,但只有第i-k个点连边为偶数时可以转移。
\(dp[i+1][j][s<<1][max(0, k-i)] += dp[i][j][s][k]\)
Code:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 32
#define ll long long
#define ld long double
#define usd unsigned
#define ull unsigned long long
//#define int long long
int n, m, k;
ll dp[N][N][1<<9][9];
const ll p=1e9+7;
inline void mod(ll& a, ll b) {a+=b; if (a>=p) a-=p;}
signed main()
{
#ifdef DEBUG
freopen("1.in", "r", stdin);
#endif
scanf("%d%d%d", &n, &m, &k);
int lim = 1<<(k+1);
dp[1][0][0][k] = 1;
for (int i=1,cnt,s2; i<=n; ++i)
for (int j=0; j<=m; ++j)
for (int s=0; s<lim; ++s)
for (int l=0; l<=k; ++l) {
if (i-k+l <= 0) continue;
cnt=0; s2=s;
while (s2) {++cnt; s2&=(s2-1);}
//if (cnt>j*2) continue;
//if (dp[i][j][s][l]) cout<<i<<' '<<j<<' '<<s<<' '<<l<<' '<<cnt<<endl;
if (l==k) {
if (!(s&(1<<k))) mod(dp[i+1][j][s<<1][max(0, k-i)], dp[i][j][s][k]);
}
else {
//if (dp[i][j][s][l]) cout<<i<<' '<<j<<' '<<s<<' '<<l<<' '<<cnt<<endl;
mod(dp[i][j+1][s^(1<<(k-l))^1][l], dp[i][j][s][l]);
mod(dp[i][j][s][l+1], dp[i][j][s][l]);
//if (dp[i][j][s][l]) {
//cout<<dp[i][j+1][s^(1<<(k-l))^1][l+1]<<endl;
//cout<<bitset<10>(s^(1<<(k-l))^1)<<endl;
//}
}
//if (i==2) printf("dp[%d][%d][%d][%d]=%lld\n", i, j, s, l, dp[i][j][s][l]);
}
printf("%lld\n", dp[n][m][0][k]);
return 0;
}
题解 [JXOI2012]奇怪的道路的更多相关文章
- bzoj 3195 [Jxoi2012]奇怪的道路
3195: [Jxoi2012]奇怪的道路 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座城市,编 ...
- [BZOJ3195][Jxoi2012]奇怪的道路
3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec Memory Limit: 128 MB Description 小宇从历史书上了解到一个古老的文明.这个文明在各个 ...
- 【BZOJ3195】[Jxoi2012]奇怪的道路 状压DP
[BZOJ3195][Jxoi2012]奇怪的道路 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有n座 ...
- [补档][Jxoi2012] 奇怪的道路
[Jxoi2012] 奇怪的道路 题目 传送门 :http://www.lydsy.com/JudgeOnline/problem.php?id=3195 小宇从历史书上了解到一个古老的文明.这个文明 ...
- 【BZOJ】3195: [Jxoi2012]奇怪的道路【状压/奇偶性】【思路】
3195: [Jxoi2012]奇怪的道路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 802 Solved: 529[Submit][Statu ...
- 3195: [Jxoi2012]奇怪的道路
3195: [Jxoi2012]奇怪的道路 链接 思路: 因为一个点只会和它前后k个点连边,所以,记录下每个点的前k个点和它自己(共k+1个点)的状态,1表示奇数,0表示偶数. dp[i][j][s] ...
- BZOJ3195:[JXOI2012]奇怪的道路——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3195 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方 ...
- [Jxoi2012]奇怪的道路 题解(From luoguBlog)
题面 状压好题 1<= n <= 30, 0 <= m <= 30, 1 <= K <= 8 这美妙的范围非状压莫属 理所当然地,0和1代表度的奇偶 dp[i][j ...
- 【bzoj3195】【 [Jxoi2012]奇怪的道路】另类压缩的状压dp好题
(上不了p站我要死了) 啊啊,其实想清楚了还是挺简单的. Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期 ...
随机推荐
- nmon工具安装及nmon analyser的使用
步骤一:下载nmon及nmon analyser工具 nmon:http://nmon.sourceforge.net/pmwiki.php 根据自己系统的版本下载相应的版本即可 nmon analy ...
- Linux SecureCRT 终端连接密钥交换失败错误
1.故障现象: 服务器升级OpenSSH和OpenSSL后,SecureCRT无法SSH登录(CRT7.0以上版本可以正常登陆,以下版本报截图错误),但是Putty等工具可以正常登录: 报错如下: S ...
- python使用笔记21--发邮件
发邮件需要第三方模块 pip install yamail 1 #import yagmail #--别人写的,发中文附件的时候是乱码 2 import yamail #牛牛基于yagmail改的 3 ...
- C语言:printf标志符
%d 十进制整数 %i %lf双精度浮点数 %o八进制整数 0%o或0%O %x十六进制整数 0x%x 或 0X%X %f单精度浮点数 %E %e科学计数法 %s 字符串 %c 字符(单个 ...
- dev c++自动添加初始源代码
1.打开 dec v++ 2.工具--编辑器属性 3."代码"选项卡,点击"缺省源" 7.选择"向项目初始源文件插入代码" 8.下面插入下面 ...
- Swift-使用transform 实现重复平移动画
摘要 要实现一组重复的动画,本质上就是找到动画开始点.结束点.在动画结束的时候,触发开始点,持续这样的动作. 这里面要梳理的逻辑就是1.触发开始点和2.监听动画结束点.这两个逻辑是实现重复动画的基础. ...
- 【LeetCode】203.移除链表元素
203.移除链表元素 知识点:链表:双指针 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 . 示例 ...
- python基础之面向对象OOP
#类(面向对象) PageObject设计模式 unittest 知识体系#函数式编程import datetimebook_info = { "title":"Pyth ...
- 进入mysql的学习>从零开始学JAVA系列
目录 MySQL的学习 什么是MYSQL 安装MYSQL Window安装MYSQL(压缩包版) 什么是MYSQL 安装MYSQL Window安装MYSQL(压缩包版) MYSQL基本指令 DDL ...
- 科普—为什么要用ECDSA加签及其数学上的验签证明
在上文介绍了ECDSA算法流程及模块划分,为了帮助一些小白弄懂啥是ECDSA,特此开一篇科普博文. 一.首先为啥要进行数字签名? 假设Alice要将一份合同m传输给Bob,合同上附有Alice的电子纸 ...