【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】公交线路(动态规划,状态压缩,矩阵快速幂)相关推荐

  1. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  2. ZOJ 2317 Nice Patterns Strike Back(矩阵快速幂)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2317 题意:给你两种颜色,黑色和白色,填充n*m的方格,每个格子一种颜色, ...

  3. 矩阵快速幂+动态规划=蓝桥杯 垒骰子

    矩阵快速幂+动态规划=蓝桥杯 垒骰子 如果还不知道什么是矩阵快速幂,可以参加我的另一篇文章:矩阵快速幂详解 题目 分析 看到 nnn 的范围达到了 10910^{9}109 ,如果使用暴力搜索是不现实 ...

  4. 15年第六届蓝桥杯第九题_(矩阵快速幂优化的动态规划)

    垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...

  5. hdu 5434(状态压缩+矩阵优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5434 官方题解: 这个题用状态转移得到矩阵,再矩阵快速幂就可以了. 合体象的攻击范围是变少了的,我们可 ...

  6. 蓝桥杯 - 垒骰子(动态规划+矩阵快速幂优化)

    垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...

  7. 垒骰子(动态规划+矩阵快速幂)

    我看到这道题目的第一想法就是动态规划,设dp[i][j]表示我们枚举了i个骰子且最上面为j的方案数,那么很显然初始化为dp[1][j]=4(j=1~6)(侧面方向不同按照不同方案来计算),递推过程很简 ...

  8. POJ - 3613 Cow Relays(Floyd思想+矩阵快速幂+动态规划)

    题目链接:点击查看 题目大意:给定一张由T(T<=100)条边构成的无向图,点的编号为1~1000,之间的整数,求从起点S到终点E恰好经过N(N<=1e6)条边(可重复经过)的最短路 题目 ...

  9. 矩阵快速幂的一份小结

    矩阵真是个好东西!虽然矩乘的复杂度有点难看... ... 这几天也做了不少矩阵题目,还是有几道好题目的.不过我打算从入门开始. 矩阵乘法:A[i][k]*B[k][j]=C[i][j];(A的第i行的 ...

最新文章

  1. 8家云计算及安全巨头联合成立云安全服务联盟
  2. linux mmap内存文件映射
  3. 20行python代码的入门级小游戏-用Python设计一个经典小游戏
  4. 使用Android内部的DownloadProvider下载文件,并获取cache权限 .
  5. Centos7 网络配置
  6. JavaScript基础01
  7. 传统Web应用案例(采用服务端渲染)
  8. 一、express 路由 todos案例
  9. Android 系统(239)---Android PMS的创建过程
  10. Python存储和读取数据
  11. java面试宝典app_Java面试宝典
  12. PC电脑控制手机iphone(iOS 11、iOS 12、iOS 13),需越狱
  13. 增强 扫描王 源码_java,OpenCV简单实现类似“全能扫描王”功能
  14. 要管理此计算机上的用户账户,Win10安装软件用户账户控制提示管理员已阻止运行此应用解决方法...
  15. 0202插入删除-算法第四版红黑树-红黑树-数据结构和算法(Java)
  16. 大工2021年11月份《电气制图与CAD》课程设计离线作业
  17. 清除composite里的子控件
  18. css 实现 防抖效果
  19. There were errors checking the update sites: SSLHandshakeException: sun.secu解决方案
  20. 简单说下YOLOv1、v2、v3、v4各自的特点与发展史

热门文章

  1. 一个IP绑定多个域名(虚拟主机)设置方法
  2. Linux下Apache自动监测重启脚本
  3. 运维老鸟职场生活交友经验谈
  4. springboot整合flink
  5. RuntimeError: Model class cmdb.models.UserInfo doesn't declare an explicit app_label
  6. 三星note4 N9100刷回4.4.4系统后无法usb连接电脑
  7. unicode编码查询方法
  8. 深度学习(二十一)——SRCNN, DRCN, VDSR
  9. linux的mutex状态查询命令,如何断言std :: mutex是否已锁定?
  10. tcpdump命令---Linux学习笔记