当前位置: 首页 > news >正文

矩阵快速幂优化状态机dp,LeetCode 552. 学生出勤记录 II

一、题目

1、题目描述

可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:

  • 'A':Absent,缺勤
  • 'L':Late,迟到
  • 'P':Present,到场

如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:

  • 按 总出勤 计,学生缺勤('A'严格 少于两天。
  • 学生 不会 存在 连续 3 天或 连续 3 天以上的迟到('L')记录。

给你一个整数 n ,表示出勤记录的长度(次数)。请你返回记录长度为 n 时,可能获得出勤奖励的记录情况 数量 。答案可能很大,所以返回对 109 + 7 取余 的结果。

2、接口描述

cpp
class Solution {
public:int checkRecord(int n) {}
};
 ​

3、原题链接

552. Student Attendance Record II


二、解题报告

1、思路分析

矩阵快速幂见:矩阵快速幂及应用实战[C/C++]_c++矩阵快速幂-CSDN博客

考虑状态机:

7 种
0 0A 0L,空或者以P结尾
1 0A, 1L,以L结尾
2 0A,2L,以2L结尾
3 1A,0L,以A结尾
4 1A,0L,以P结尾
5 1A,1L,以L结尾
6 1A,2L,以2L结尾

那么我们定义f(i, j) 为前i个字符,状态为j的情况数,转移如下:

f(i + 1, 0) = f(i, 0) + f(i, 1) + f(i, 2)
f(i + 1, 1) = f(i, 0)
f(i + 1, 2) = f(i, 1)
f(i + 1, 3) = f(i, 0) + f(i, 1) + f(i, 2)
f(i + 1, 4) = f(i, 3) + f(i, 4) + f(i, 5) + f(i, 6)
f(i + 1, 5) = f(i, 3) + f(i, 4)
f(i + 1, 6) = f(i, 5)

我们可以O(N)进行计算,也可以矩阵快速幂优化状态机dp

2、复杂度

时间复杂度: O(log(n) * 7^3)空间复杂度:O(7^3)

3、代码详解

cpp
using i64 = long long;
constexpr int P = 1E9 + 7;struct Matrix {int m, n;std::vector<std::vector<int>> g;Matrix(int _m, int _n) : m(_m), n(_n), g(_m, std::vector<int>(_n)){}Matrix(const std::vector<std::vector<int>> &_init) : m(_init.size()), n(_init[0].size()), g(_init) {}Matrix(const Matrix &a) : Matrix(a.g) {}void init() {assert(m == n); for (int i = 0; i < m; ++ i)g[i].assign(m, 0), g[i][i] = 1;}const std::vector<int>& operator [] (int i) const {assert(i < m);return g[i];}void show() const {for (int i = 0; i < m; ++ i)for (int j = 0; j < n; ++ j) std::cout << g[i][j] << " \n"[j + 1 == n]; std::cout << '\n';}friend inline Matrix operator * (const Matrix &a, const Matrix &b) {int m = a.m, n = b.n, t = a.n;Matrix res(m, n);for (int i = 0; i < m; ++ i)for (int k = 0; k < t; ++ k)for (int j = 0; j < n; ++ j) res.g[i][j] = (res.g[i][j] + 1LL * a[i][k] * b[k][j] % P) % P;return res;}friend inline Matrix power(Matrix a, i64 b) {Matrix res(a.m, a.m);res.init(); for (; b; b >>= 1, a = a * a) if (b & 1)res = res * a;return res;}
};class Solution {
public:int checkRecord(int n) {std::vector<std::vector<int>> a(1, {1, 0, 0, 0, 0, 0, 0}), b({{1, 1, 0, 1, 0, 0, 0},{1, 0, 1, 1, 0, 0, 0},{1, 0, 0, 1, 0, 0, 0},{0, 0, 0, 0, 1, 1, 0},{0, 0, 0, 0, 1, 1, 0},{0, 0, 0, 0, 1, 0, 1},{0, 0, 0, 0, 1, 0, 0}});Matrix base(a), help(b);auto g = (base * power(help, n)).g[0];return std::accumulate(g.begin(), g.end(), 0LL) % P;}
};
 ​

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • redis学习笔记——redis中的常见数据类型以及相关命令
  • Java基础——IService.class 中查询数据方法list() 源码剖析及使用
  • 《区块链与监管合规:在创新与规范之间寻求平衡》
  • 基于ssm+vue+uniapp的二手物品交易平台小程序
  • Linux安装MQTT 服务器(图文教程)
  • Swift 基本语法
  • 【算法】dfs转dp的通用方式
  • Python 办公自动化 处理 Excel 数据 【1】推荐
  • 设计模式实战:即时通讯应用的设计与实现
  • 主成分分析SPSS步骤+Matlab程序
  • OLAP引擎之Druid
  • 洛谷 CF295D Greg and Caves
  • Java数组的应用场景
  • 音频剪辑软件哪个好用?五大音频剪辑软件分享
  • Chrome快捷键提高效率
  • [Vue CLI 3] 配置解析之 css.extract
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 07.Android之多媒体问题
  • Docker: 容器互访的三种方式
  • Java深入 - 深入理解Java集合
  • Java新版本的开发已正式进入轨道,版本号18.3
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Nodejs和JavaWeb协助开发
  • React的组件模式
  • REST架构的思考
  • Vue官网教程学习过程中值得记录的一些事情
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 什么是Javascript函数节流?
  • 使用权重正则化较少模型过拟合
  • 世界上最简单的无等待算法(getAndIncrement)
  • -- 数据结构 顺序表 --Java
  • 数据结构java版之冒泡排序及优化
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 回归生活:清理微信公众号
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #stm32整理(一)flash读写
  • $L^p$ 调和函数恒为零
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (day18) leetcode 204.计数质数
  • (done) 两个矩阵 “相似” 是什么意思?
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (python)数据结构---字典
  • (ZT)一个美国文科博士的YardLife
  • (阿里云万网)-域名注册购买实名流程
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (一)基于IDEA的JAVA基础10