码迷,mamicode.com
首页 > 其他好文 > 详细

【矩阵乘优化DP】涂色游戏

时间:2020-09-24 21:30:59      阅读:27      评论:0      收藏:0      [点我收藏+]

标签:time   log   mat   矩阵快速幂   cap   mit   方案   游戏   要求   

题目大意

\(p\) 种颜色填 \(n\times m\) 的画板,要求任意相邻两列的颜色数都不少于 \(p\) ,求方案数。

数据范围

\(1\leq n\leq 100,1\leq m\leq 10^9,q\leq p\leq 100\)

思路

观摩 \(m\) 的范围,显然需要一个 \(\log m\) 的做法,于是想到了矩阵快速幂。

首先考虑原始的转移。对于每一列,定义 \(g[i][j]\) ,表示当前填到第 \(i\) 行的格子,用了 \(j\) 种颜色的方案数。由于每一列的情况都是类似的,所以可以预处理出来。

\[g[i][j]=g[i-1][j-1]\times (p-(j-1))+g[i-1][j]\times j \]

加号前的转移表示选了一个新的颜色,加号之后的是我在之前选的 \(j\) 种颜色中又选了一种填在这里。

所以所有的 \(g[n][j]\) 则表示当前一列选了\(j\) 种颜色的方案数。根据第二类斯特林数,当前一列涂上 \(j\) 种颜色的方案数就是 \(\cfrac{g[n][j]}{C_p^j}\)

所以若当前一列涂上 \(j\) 种颜色,下一列要涂 \(k\) 种颜色,则方案数如下:

\[\sum \limits_{x=\max(q,j,k)}^{\min(p,j+k)}C_j^{j+k-x}C_{p-i}^{x-j} \]

前一个组合数是 \(j\)\(k\) 颜色中交集的部分,而后一个就是交集的补集。其中边界的意思分别为 \(j\cap k=\varnothing\)\(j\subset k\)\(k\subset j\)

\(h[i][j]\) 表示:

\[h[j][k]=\cfrac{g[n][j]}{C_p^j}\cdot\sum \limits_{x=\max(q,j,k)}^{\min(p,j+k)}C_j^{j+k-x}C_{p-i}^{x-j} \]

则令 \(f[i][j]\) 为当前选到第 \(i\) 列,当前一列涂了 \(j\) 种颜色的方案数,则可以得到 \(f[i][j]=f[i-1][j]\times h[j][k]\),边界为 \(f[1][j]=g[n][j]\)。由于 \(f\) 的转移系数与 \(i\) 无关,所以可以用矩阵快速幂优化转移 \(m-1\) 次后得到结果,时间复杂度 \(O(n^3\log m)\)

【矩阵乘优化DP】涂色游戏

标签:time   log   mat   矩阵快速幂   cap   mit   方案   游戏   要求   

原文地址:https://www.cnblogs.com/Midoria7/p/13720879.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!