形态形成场(矩阵乘法优化dp)

短信中将会涉及前\(k\)种大写字母,每个大写字母都有一个对应的替换式\(Si\),替换式中只会出现大写字母和数字,比如\(A→BB,B→CC0,C→123\),代表 \(A=12312301231230,B=1231230,C=123\)。现在对于给定的替换式,求字符 A 所代表的串有多少子串满足:

  • 这个子串为单个字符\(0\)或没有前导\(0\)。
  • 把这个子串看作一个十进制数后模\(n\)等于\(0\)。

答案对\(r\)取模。对于100%的数据,$2 \leq r \leq 10^9; 1 \leq k \leq 26; 4 \leq \left| S_i \right| \leq 100 $。

首先可以想出一个暴力dp:\(f[i][j]\)表示到第i位时,模n为j的串的个数,那么显然\(f[i][(10j+s[i])\%n]+=f[i-1][j]\)。复杂度是\(O(len\times n)\)。

但是这样只能拿60分,并不能过这道题。怎么办呢?观察一下题目,其实就是将一个字符的字符串展开以后dp,并且最多展开26层,同一个字符可能被展开多次。有没有想到矩阵优化dp?由于每次\(f[s[i]\%n]\)要加上1,因此不能用传统的矩阵递推数列,还必须在向量中加上一维常量1。为了方便,再在向量中加一维ans。向量长这样:

\((f_0, f_1, f_2,\dots,f_{n-1},ans,1)\)。

这样转移矩阵\(g[n+1][n+1]\)就可以被描述为:

\(\left [ \begin{matrix} & 第1列 & 第i列 & 第n列 & 第n+1列 \\第一行 & \dots & \dots & 1&0 \\ 第二行 & \dots & \dots & 0 & 0 \\ 第三行 & \dots & \dots & 0 & 0 \\ \dots \\ 第n行 & 0 & 0 & 1 & 0 \\ 第n+1行 & 0 & [s[i]=ch]*[ch!='0'] & 0 & 1\end{matrix} \right ]\)

先将矩阵进行处理,再把初始向量和矩阵相乘。\((0, 0, \dots,0, 1)*g[n+1][n+1]=(f_0, f_1, \dots,ans,1)\),答案就是\(f_0+ans\)。由于初始向量只有第n+1项是1,所以\(f_0+ans=g[n+1][0]+g[n+1][n]\)。

注意单个字符0不能被漏掉统计,因此需要记录串中的0的个数。

#include <cctype>
#include <cstdio>
#include <cstring>
using namespace std;typedef long long LL;
const int maxk=30, maxn=40, maxl=105;
int n, r, k, zero[maxn];
char s[maxk][maxl];
struct Mat{int g[maxn][maxn];
}matrix[maxn], C;
void up(int &x, int y){ x+=y-r; x=(x<0?x+r:x); }
Mat& operator *(const Mat &A, const Mat &B){memset(C.g, 0, sizeof(C.g));for (int i=0; i<=n+1; ++i)for (int j=0; j<=n+1; ++j)for (int k=0; k<=n+1; ++k)up(C.g[i][j], 1ll*A.g[i][k]*B.g[k][j]%r);return C;
}void build(int id){  //复合字符'A'+i 所对应的转移矩阵 int len=strlen(s[id]), num;Mat &now=matrix[id], trans;for (int i=0; i<=n+1; ++i) now.g[i][i]=1;  //相当于直接让转移矩阵相乘 for (int i=3; i<len; ++i){if (isdigit(s[id][i])){num=s[id][i]-'0';memset(trans.g, 0, sizeof(trans.g));trans.g[0][n]=trans.g[n][n]=trans.g[n+1][n+1]=1;for (int j=0; j<n; ++j) trans.g[j][(j*10+num)%n]=1;if (num) trans.g[n+1][num%n]=1;else up(zero[id], 1);now=now*trans;} else {num=s[id][i]-'A';now=now*matrix[num];up(zero[id], zero[num]);}}
}int main(){scanf("%d%d%d", &n, &r, &k);for (int i=0; i<k; ++i) scanf("%s", s[i]);for (int i=k-1; ~i; --i) build(i);int ans=zero[0]; up(ans, matrix[0].g[n+1][0]);up(ans, matrix[0].g[n+1][n]);printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/MyNameIsPc/p/9362107.html

形态形成场(矩阵乘法优化dp)相关推荐

  1. 【Contra】 矩阵乘法优化 dp

    偶然间,chnlich发现了他小时候玩过的一个游戏"魂斗罗",于是决定怀旧.但是这是一个奇怪的魂斗罗MOD.有N个关卡,初始有Q条命.每通过一个关卡,会得到u分和1条命,生命上限为 ...

  2. 【BZOJ 3326】[Scoi2013]数数 数位dp+矩阵乘法优化

    挺好的数位dp-- 先说一下我个人的做法: 经过观察,发现这题按照以往的思路从后往前递增,不怎么好推,然后我就大胆猜想,从前往后推,发现很好推啊,维护四个变量,从开始位置到现在有了i个数 f[i]:所 ...

  3. 【学习笔记】浅谈广义矩阵乘法——动态DP

    文章目录 广义矩阵乘法 动态DP 例题:洛谷4719 以下内容是本人做题经验,如有雷同,纯属抄袭:如有不对,纯属不懂,还请指正 广义矩阵乘法 众所周知,矩阵满足乘法交换律,前一个矩阵的列必须是后一个矩 ...

  4. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  5. CUDA实例系列一: 矩阵乘法优化

    CUDA实例系列一----矩阵乘法优化 很多朋友在学习CUDA的时候都会面临一个题目----矩阵乘法, 这也是CUDA最广泛的应用之一. 本文将详细讲解如何利用GPU加速矩阵乘法的计算. 话不多说, ...

  6. OpenBLAS项目与矩阵乘法优化 | AI 研习社

    提起矩阵计算,学过<高等数学>的人可能都听过,但若不是这个领域的研究者,恐怕也只停在"听过"的程度.在矩阵计算领域,开源项目OpenBLAS影响巨大,除IBM.华为等巨 ...

  7. 并行程序设计方法实验(包括openmp、向量化实现pi计算、SPECOMP2012测试、矩阵乘法优化)

    目录 一.实验环境 二.专题一之积分计算圆周率 2.1向量优化 2.2 OpenMP优化 三.专题二之测试SPECOMP2012 3.1初步了解SPECOMP 3.2系统基本配置 3.3实践 3.3. ...

  8. 基于how-to-optimize-gemm初探矩阵乘法优化

    1. 前言 这次,我们来聊一个轻松一点的话题,那就是给你一个矩阵A和一个矩阵B,使用矩阵乘法获得目标矩阵C,相信大家都不难写出下面的代码: #define A( i, j ) a[ (i)*lda + ...

  9. 矩阵乘法 递归 优化 c语言,矩阵乘法优化递归式

    序: 在OI比赛中,很多情况下我们可以能通过打表(找规律)或者某些方式发现一个递归式. 例如:f(n) = f(n - 1)+f(n - 2),(斐波那契数列). 通常情况下,我们计算f(n)的时间复 ...

最新文章

  1. springmvc开启事务_java面试题 一 :SpringMvc的流程
  2. 完全相同的4个小矩形如图所示放置_3个数学难题——走进传奇数学天才的数字游戏...
  3. 利用Crawlspider爬取腾讯招聘数据(全站,深度)
  4. Visual Studio 竖向选择功能
  5. Spring MVC表单教程
  6. 【文末有福利】量子计算是对计算本质的发现
  7. Office Communications Server 和客户端使用的端口和协议
  8. 车辆销售系统用例_汽车销售管理系统UML建模分析.doc
  9. 笔记本电脑双显卡怎么切换独立显卡的方法
  10. 2021-11-10全球货币市场基础知识系列3
  11. go mod tidy 报错:verifying ...: checksum mismatch
  12. 亲爱的朋友,祝您天天好心情!
  13. 60分钟吃掉嘎嘣脆的DeepCross模型
  14. 大卫 异星觉醒 机器人_《异星觉醒》披着科幻外衣的老套惊悚片
  15. ssh整合(spring+springmvc+hibernate)
  16. iOS 支付 [支付宝 银联 微信]
  17. 常用Android第三方库推荐
  18. 「Ceph源码分析」纠删码解码
  19. 前端基础入门之css像素与视口和媒体查询
  20. 教你如何显示隐藏文件

热门文章

  1. Spark使用总结与分享
  2. 历史性胜利!纽约曼哈顿充电站数量超过加油站
  3. 6.LibSVM核函数
  4. 算了一挂,也不知准不准
  5. 爨底下-双龙峡,凑合的一日游
  6. tab in English
  7. things to do in English debate: scenario
  8. intrigue more
  9. english writing sample for professional
  10. 硅谷创业公司的成长道路