【BZOJ2004】公交线路(动态规划,状态压缩,矩阵快速幂)
【BZOJ2004】公交线路(动态规划,状态压缩,矩阵快速幂)
题面
BZOJ
题解
看到\(k,p\)这么小
不难想到状态压缩
看到\(n\)这么大,不难想到矩阵快速幂
那么,我们来考虑朴素的\(dp\)
设\(f[i][j]\)表示当前位置为\(i\),前面的\(P\)个位置的状态为\(j\)
其中,状态的含义是某个公交线路最后的停靠站
如果是最后的停靠站就是\(1\),否则是\(0\)
那么,任意状态中只存在\(k\)个\(1\)
并且表示\(i\)的二进制位一定是\(1\)
所以状态相当于最多只会有\(120\)个左右
考虑转移,
每次相当于从原来的状态中,
把一个\(1\)放到了当前位置
其他的依次向左挪一个位置
那么,如果两个状态之间满足这个关系,就可以转移
我们发现转移之和后面的\(j\)有关
所以矩阵快速幂就行了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MOD 30031
inline int read()
{RG int x=0,t=1;RG char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t;
}
int n,K,P;
int zt[1<<11],ss,mp[1<<11];
struct Dalao
{int s[150][150];void init(){memset(s,0,sizeof(s));}void pre(){init();for(int i=1;i<=ss;++i)s[i][i]=1;}
}zsy;
Dalao operator*(Dalao a,Dalao b)
{Dalao ret;ret.init();for(int i=1;i<=ss;++i)for(int j=1;j<=ss;++j)for(int k=1;k<=ss;++k)ret.s[i][j]=(ret.s[i][j]+a.s[i][k]*b.s[k][j]%MOD)%MOD;return ret;
}
Dalao fpow(Dalao a,int b)
{Dalao s;s.pre();while(b){if(b&1)s=s*a;a=a*a;b>>=1;}return s;
}
int ws(int x){int ret=0;while(x)++ret,x-=x&(-x);return ret;}
bool check(int a,int b)
{if(ws((a<<1)&b)!=K-1)return false;return true;
}
int main()
{n=read();K=read();P=read();for(int i=0;i<(1<<P);++i)if((i&1)&&ws(i)==K)zt[++ss]=i;for(int i=1;i<=ss;++i)for(int j=1;j<=ss;++j)if(check(zt[i],zt[j]))zsy.s[j][i]=1;zsy=fpow(zsy,n-K);printf("%d\n",zsy.s[1][1]);return 0;
}
转载于:https://www.cnblogs.com/cjyyb/p/8434235.html
【BZOJ2004】公交线路(动态规划,状态压缩,矩阵快速幂)相关推荐
- BZOJ 2004 公交线路(状压DP+矩阵快速幂)
注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...
- ZOJ 2317 Nice Patterns Strike Back(矩阵快速幂)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2317 题意:给你两种颜色,黑色和白色,填充n*m的方格,每个格子一种颜色, ...
- 矩阵快速幂+动态规划=蓝桥杯 垒骰子
矩阵快速幂+动态规划=蓝桥杯 垒骰子 如果还不知道什么是矩阵快速幂,可以参加我的另一篇文章:矩阵快速幂详解 题目 分析 看到 nnn 的范围达到了 10910^{9}109 ,如果使用暴力搜索是不现实 ...
- 15年第六届蓝桥杯第九题_(矩阵快速幂优化的动态规划)
垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...
- hdu 5434(状态压缩+矩阵优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5434 官方题解: 这个题用状态转移得到矩阵,再矩阵快速幂就可以了. 合体象的攻击范围是变少了的,我们可 ...
- 蓝桥杯 - 垒骰子(动态规划+矩阵快速幂优化)
垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...
- 垒骰子(动态规划+矩阵快速幂)
我看到这道题目的第一想法就是动态规划,设dp[i][j]表示我们枚举了i个骰子且最上面为j的方案数,那么很显然初始化为dp[1][j]=4(j=1~6)(侧面方向不同按照不同方案来计算),递推过程很简 ...
- POJ - 3613 Cow Relays(Floyd思想+矩阵快速幂+动态规划)
题目链接:点击查看 题目大意:给定一张由T(T<=100)条边构成的无向图,点的编号为1~1000,之间的整数,求从起点S到终点E恰好经过N(N<=1e6)条边(可重复经过)的最短路 题目 ...
- 矩阵快速幂的一份小结
矩阵真是个好东西!虽然矩乘的复杂度有点难看... ... 这几天也做了不少矩阵题目,还是有几道好题目的.不过我打算从入门开始. 矩阵乘法:A[i][k]*B[k][j]=C[i][j];(A的第i行的 ...
最新文章
- 8家云计算及安全巨头联合成立云安全服务联盟
- linux mmap内存文件映射
- 20行python代码的入门级小游戏-用Python设计一个经典小游戏
- 使用Android内部的DownloadProvider下载文件,并获取cache权限 .
- Centos7 网络配置
- JavaScript基础01
- 传统Web应用案例(采用服务端渲染)
- 一、express 路由 todos案例
- Android 系统(239)---Android PMS的创建过程
- Python存储和读取数据
- java面试宝典app_Java面试宝典
- PC电脑控制手机iphone(iOS 11、iOS 12、iOS 13),需越狱
- 增强 扫描王 源码_java,OpenCV简单实现类似“全能扫描王”功能
- 要管理此计算机上的用户账户,Win10安装软件用户账户控制提示管理员已阻止运行此应用解决方法...
- 0202插入删除-算法第四版红黑树-红黑树-数据结构和算法(Java)
- 大工2021年11月份《电气制图与CAD》课程设计离线作业
- 清除composite里的子控件
- css 实现 防抖效果
- There were errors checking the update sites: SSLHandshakeException: sun.secu解决方案
- 简单说下YOLOv1、v2、v3、v4各自的特点与发展史
热门文章
- 一个IP绑定多个域名(虚拟主机)设置方法
- Linux下Apache自动监测重启脚本
- 运维老鸟职场生活交友经验谈
- springboot整合flink
- RuntimeError: Model class cmdb.models.UserInfo doesn't declare an explicit app_label
- 三星note4 N9100刷回4.4.4系统后无法usb连接电脑
- unicode编码查询方法
- 深度学习(二十一)——SRCNN, DRCN, VDSR
- linux的mutex状态查询命令,如何断言std :: mutex是否已锁定?
- tcpdump命令---Linux学习笔记