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

如果还不知道什么是矩阵快速幂,可以参加我的另一篇文章:矩阵快速幂详解

题目

分析

看到 nnn 的范围达到了 10910^{9}109 ,如果使用暴力搜索是不现实的。

我们看看是否可以利用动态规划解决问题呢?

首先定义我们 dpdpdp 数组的含义

dp[i][j]dp[i][j]dp[i][j] 为第 iii 个骰子, jjj 面朝上时的组合数。

列出 base case

只有一个骰子时,jjj 面朝上时,有四种方式。因为骰子有四个侧面,可以选择任意侧面。

即:dp[1][1]=dp[1][2]=...=dp[1][6]=4dp[1][1] = dp[1][2] = ... =dp[1][6]=4dp[1][1]=dp[1][2]=...=dp[1][6]=4

状态转移方程

如果没有排斥面,则对于第 iii 个骰子, jjj 面朝上时,第 i−1i-1i−1 个骰子任意面朝上都可以,则方案数为

dp[i][j]=(dp[i−1][1]+dp[i−1][2]+...dp[i−1][6])∗4dp[i][j] = (dp[i-1][1] + dp[i-1][2] + ...dp[i-1][6])*4dp[i][j]=(dp[i−1][1]+dp[i−1][2]+...dp[i−1][6])∗4

由示例 111 面和 222 面相排斥,则

dp[i][4]=(dp[i−1][1]+dp[i−1][3]+...+dp[i−1][6])∗4dp[i][4]=(dp[i-1][1] + dp[i-1][3] +...+dp[i-1][6]) * 4dp[i][4]=(dp[i−1][1]+dp[i−1][3]+...+dp[i−1][6])∗4 (444 的对面才为 111)

dp[i][5]=(dp[i−1][2]+dp[i−1][3]+...+dp[i−1][6])∗4dp[i][5]=(dp[i-1][2]+dp[i-1][3]+...+dp[i-1][6]) * 4dp[i][5]=(dp[i−1][2]+dp[i−1][3]+...+dp[i−1][6])∗4 (555 的对面才为 222)

则可知对于第 iii 个骰子, jjj 面朝上时的方案数为,第 i−1i-1i−1 个骰子与 jjj 对面不排斥的面的方案数之和乘 444

再分析

我们已经推导出动态规划的解决方案,可是对于 10910^9109 的数据量,此方案还是无能为力,尽管似乎足够好了。

这时我们就需要引入矩阵快速幂将 O(n)O(n)O(n) 的时间复杂度降为 O(log⁡(n))O(\log(n))O(log(n))

对于示例我们可以得到如下矩阵表达式

注意标为红色的 000 ,是因为 444 和 555 的对面分别为 111 和 222 ,而 111 和 222 相互排斥。

递推得

由此我们只需求出矩阵 AAA 的 n−1n-1n−1 次方,而利用矩阵快速幂我们即可在 O(log⁡(n))O(\log(n))O(log(n)) 的时间得到结果。

代码

import java.util.Scanner;public class Main {static int n, m, mod = (int) (1e9 + 7);// oppo[j] 为 j 面的对面static int[] oppo = {0, 4, 5, 6, 1, 2, 3};static long[][] a = new long[7][7];// 单位矩阵 estatic long[][] e = new long[7][7];// 初始化static {for (int i = 1; i < 7; i++) {e[i][i] = 1;for (int j = 1; j < 7; j++)a[i][j] = 4;}}static long[][] mul(long[][] x, long[][] y) {long[][] res = new long[7][7];for (int i = 1; i < x.length; i++) {for (int j = 1; j < y[0].length; j++) {long t = 0;for (int k = 1; k < x[0].length; k++) {t = (t + x[i][k] * y[k][j]) % mod;}res[i][j] = t;}}return res;}static long[][] pow(long[][] x, long n) {if (n == 0) return e;long[][] res = pow(mul(x, x), n / 2);if ((n & 1) != 0) res = mul(x, res);return res;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();for (int i = 0; i < m; i++) {int x = sc.nextInt();int y = sc.nextInt();// 将排斥的面赋值为 0a[oppo[x]][y] = a[oppo[y]][x] = 0;}long[][] b = {{0, 0}, {0, 4}, {0, 4}, {0, 4}, {0, 4}, {0, 4}, {0, 4}};long[][] t = mul(pow(a, n - 1), b);long ans = 0;for (int i = 1; i < 7; i++)ans = (ans + t[i][1]) % mod;System.out.println(ans);}
}

矩阵快速幂+动态规划=蓝桥杯 垒骰子相关推荐

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

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

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

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

  3. 蓝桥杯垒骰子(动态规划)

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

  4. 矩阵的幂运算--蓝桥杯

    试题 基础练习 矩阵乘法 题目 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个N阶矩阵A,输出A的M次幂(M是非负整数) 例如: A = 1 2 3 4 A的2次幂 7 1 ...

  5. 【蓝桥杯】15年初赛 垒骰子,矩阵快速幂

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

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

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

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

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

  8. 蓝桥杯-蓝跳跳(矩阵快速幂 70%数据)

    蓝桥杯-蓝跳跳(矩阵快速幂 70%数据) 题目描述 小蓝制作了一个机器人,取名为蓝跳跳,因为这个机器人走路的时候基本靠跳跃. 蓝跳跳可以跳着走,也可以掉头.蓝跳跳每步跳的距离都必须是整数,每步可以跳不 ...

  9. 蓝桥杯 算法提高 递推求值(矩阵快速幂)详解

    传送门 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3 ...

最新文章

  1. Python三十年技术演变史
  2. git cherry-pick 分支转移教程
  3. 物理哲学和生物哲学的对抗
  4. LNK1181 无法打开输入文件“myelin64_1.lib“
  5. C++调用Python Py_Initialize失败
  6. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP
  7. python的基本结构_python基础--结构篇
  8. 浅谈sql中的in与not in,exists与not exists的区别
  9. mock java 反射,PowerMock,Mockito和反射api的最终类
  10. oracle统计信息
  11. 大数据平台应用开发的痛点有哪些
  12. NYOJ a problem is easy
  13. 丁可以组什么词_“一”可以组什么词?落语读书会学期总结
  14. 联想y470上三代cpu_联想Y470笔记本i3处理器能换i5或者i7处理器嘛?
  15. 3dmax2016软件一打开文件就程序错误的原因及解决方法
  16. 网络安全技术第六章——第一节计算机病毒及其防治(中毒表现、计算机病毒概述、计算机病毒分类、病毒传播路径、计算机病故防治建议、我之前写过一篇这个,有需要的可以去看一下)
  17. 北京智源人工智能研究院(BAAI)前沿报告——强化学习领域
  18. 最近工作用到的sql脚本
  19. python文件操作的几种方法with open,r,w,b
  20. 简单实现 Android 闹钟

热门文章

  1. ACM总结——动态规划
  2. 高数————思维导图(上岸必备)(微分方程部分)
  3. Mol Cell Proteomics. |彭建祥| 人胃肠道间质瘤亚群蛋白质组图谱
  4. 头条大佬们的成功 除了产品选择之外还不能缺少这一样东西
  5. 【沧海拾昧】Keil uVision5新建stm32工程并联合Proteus 8 Professional简单仿真
  6. 适合房产中介使用的房产管理系统源码哪个比较好用?
  7. 先进云计算网络架构基本要求
  8. 119年神灯观看地址
  9. java请设计一个一百亿的计算机,请设计一个一百亿的计算器
  10. 安兔兔android手机性能排行榜,安兔兔发布:2018年9月Android手机性价比排行榜