博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 2004 [Hnoi2010]Bus 公交线路
阅读量:6504 次
发布时间:2019-06-24

本文共 1614 字,大约阅读时间需要 5 分钟。

题目链接

题解

状压dp,记f[i][S]f[i][S]f[i][S]表示[1,i−p][1,i-p][1,ip]的车都被安排好了,而[i−p+1,i][i-p+1,i][ip+1,i]的车中,SSS中有111的位置都安排有车停,并且恰好只有kkk个位置安排了(就是kkk辆车安排到的最后一个站,按照定义,显然kkk辆车安排的终点站必定在[i−p+1,i][i-p+1,i][ip+1,i]内),其他的都没有安排。为了防止重复统计,钦定SSS的最高位(i−p+1i-p+1ip+1)必定为111

转移的话就是,如果f[i][S]f[i][S]f[i][S]f[i−1][T]f[i-1][T]f[i1][T]TTT中的所有111SSS中的所有111能对应上,那么f[i][S]f[i][S]f[i][S]就可以从f[i−1][T]f[i-1][T]f[i1][T]转移过来。

由于状态总数为(nn/2)\binom{n}{n/2}(n/2n)(最大是126),因此可以用矩阵乘法加速转移。

代码

#include 
#include
int read(){
int x=0,f=1; char ch=getchar(); while((ch<'0')||(ch>'9')) {
if(ch=='-') {
f=-f; } ch=getchar(); } while((ch>='0')&&(ch<='9')) {
x=x*10+ch-'0'; ch=getchar(); } return x*f;} const int maxm=126;const int mod=30031; struct matrix{
int n,m,a[maxm+2][maxm+2]; matrix operator *(const matrix &other) const {
matrix res; res.n=n; res.m=other.m; memset(res.a,0,sizeof res.a); for(int i=1; i<=n; ++i) {
for(int j=1; j<=other.m; ++j) {
for(int k=1; k<=m; ++k) {
res.a[i][j]=(res.a[i][j]+1ll*a[i][k]*other.a[k][j])%mod; } } } return res; }}; int stand[maxm+2],n,p,k,tot;matrix start,trans,ans; matrix quickpow(matrix res,matrix a,int b){
while(b) {
if(b&1) {
res=res*a; } a=a*a; b>>=1; } return res;} int main(){
n=read(); p=read(); k=read(); for(int i=1<<(k-1); i<1<

转载于:https://www.cnblogs.com/Canopus-wym/p/10376137.html

你可能感兴趣的文章
jre与jdk的区别
查看>>
全景图的种类
查看>>
git 维护
查看>>
jfinal框架下使用c3P0连接池连接sql server 2008
查看>>
Jfinal Generator 不需要生成带某个前缀的表名数组的方法
查看>>
struts2中使用标签操作静态方法等
查看>>
熬夜写了一个小游戏,向SpaceX聊表敬意
查看>>
身份证工具类
查看>>
JPA增删改查,
查看>>
apache 开启 gzip 压缩服务
查看>>
python mysql
查看>>
开源 免费 java CMS - FreeCMS1.5-建站向导
查看>>
Selenium的延迟等待
查看>>
jquery 1.6以上版本 全选
查看>>
AppCan 学习
查看>>
flask框架
查看>>
《疯狂Java讲义》学习笔记(十)异常处理
查看>>
Lua(Codea) 中 table.insert 越界错误原因分析
查看>>
ELK 5.x日志分析 (二) Elasticserach 5.2 安装
查看>>
sbt配置nexus仓库
查看>>