【leetcode】552. Student Attendance Record II
题目如下:
Given a positive integer n, return the number of all possible attendance records with length n, which will be regarded as rewardable. The answer may be very large, return it after mod 109 + 7.
A student attendance record is a string that only contains the following three characters:
- 'A' : Absent.
- 'L' : Late.
- 'P' : Present.
A record is regarded as rewardable if it doesn't contain more than one 'A' (absent) or more than two continuous 'L' (late).
Example 1:
Input: n = 2
Output: 8
Explanation:
There are 8 records with length 2 will be regarded as rewardable:
"PP" , "AP", "PA", "LP", "PL", "AL", "LA", "LL"
Only "AA" won't be regarded as rewardable owing to more than one absent times.Note: The value of n won't exceed 100,000.
解题思路:根据题目要求,A最多可以出现1次,同时L不能连续出现三个及以上。显然,所有符合条件的出席记录 = 不包含A的出席记录数 + 包含A的出席记录数。首先来看不包含A的出席记录数怎么求,假设dp[i][0]和dp[i][1]分别表示第i个元素为L和为P时候可以构成的符合条件的出席记录数,那么有dp[i][1] = dp[i-1][0] + dp[i-1][1],因为如果第i位是P,那么i-1是L或者是P都是允许的;同时有 dp[i][0] = dp[i-2][0] + dp[i-2][1]*2,这是因为如果第i位是L,如果i-2位也是L的话,则第i-1位就只能是P,而i-2是P的话,第i-2位是L或者是P都是允许的。接下来看包含A的情况,假设A放在出席记录的第i位的位置,出席记录就会被分割成[0:i-1]和[i+1:n]两段,这两段也只能包含L和P,所以正好又可以转化为第一种情况中已经计算出来的dp[i-1]和dp[n-i]两种,A在第i位符合条件的出席记录数就是dp[i-1]*dp[n-i],依次累计A在第0位~第N-1位的出席记录数总和,再加上第一种情况的个数,即为最后的结果。
代码如下:
class Solution(object):
def checkRecord(self, n):
"""
:type n: int
:rtype: int
"""
MOD = pow(10,9) + 7
if n <= 1:
return [0,3][n]
dp = []
for i in range(n): #0:L,1:P
dp.append([0]*2)
dp[0][0] = dp[0][1] = 1
dp[1][0] = dp[1][1] = 2
for i in range(2,n):
dp[i][0] = (dp[i-2][0] % MOD + (dp[i-2][1]*2) % MOD) % MOD
dp[i][1] = (dp[i-1][0] % MOD + dp[i-1][1] % MOD) % MOD
res = 0
for i in range(n):
if i == 0 or i == n - 1:
res += (dp[n-2][0] + dp[n-2][1])
else:
res += (dp[i-1][0] + dp[i-1][1]) * (dp[n-i-2][0] + dp[n-i-2][1])
return (res + dp[-1][0] + dp[-1][1]) % (pow(10, 9) + 7)
【leetcode】552. Student Attendance Record II的更多相关文章
- 【LeetCode】551. Student Attendance Record I 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 正则表达式 统计 日期 题目地址:https://l ...
- [LeetCode] 552. Student Attendance Record II 学生出勤记录之二
Given a positive integer n, return the number of all possible attendance records with length n, whic ...
- 552. Student Attendance Record II
Given a positive integer n, return the number of all possible attendance records with length n, whic ...
- 【leetcode_easy】551. Student Attendance Record I
problem 551. Student Attendance Record I 题意: solution: class Solution { public: bool checkRecord(str ...
- 552 Student Attendance Record II 学生出勤记录 II
给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量. 答案可能非常大,你只需返回结果mod 109 + 7的值.学生出勤记录是只包含以下三个字符的字符串: 1.'A' : ...
- 【LeetCode】522. Longest Uncommon Subsequence II 解题报告(Python)
[LeetCode]522. Longest Uncommon Subsequence II 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemin ...
- [LeetCode] Student Attendance Record II 学生出勤记录之二
Given a positive integer n, return the number of all possible attendance records with length n, whic ...
- [Swift]LeetCode552. 学生出勤记录 II | Student Attendance Record II
Given a positive integer n, return the number of all possible attendance records with length n, whic ...
- 【Leetcode】Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3 ...
随机推荐
- SCJP之赋值
1:基本变量赋值与另一个基本变量 public class Test { public static void main(String[] args) { int a=10; int b=a; b=3 ...
- c# 如何获取系统管理员权限(UAC) 及判断当前是否是管理员权限
环境说明: VS2012,windows 7 亲自验证过win7 和xp ,XP直接不弹框,因为XP没有UAC控制机制 步骤1: 右键项目-->属性-->安全性-->选中[启用Cl ...
- 【LeetCode 96】不同的二叉搜索树
题目链接 [题解] 我们可以枚举这棵树的根节点在i处. 现在问题就变成. 1..i-1这i-1个节点组成的树和i+1..n这n-i个节点组成的树的个数的问题了. 假设他们俩的结果分别是cnt1和cnt ...
- R中unlist函数的使用
买的书里面实例讲的不清不楚,所以看帮助文档了 用法:unlist(x, recursive = TRUE, use.names = TRUE) 帮助文档讲x可以是向量或者列表,如果是向量,则原样返回, ...
- selenium问题之定位不到元素(NoSuchElementException)
在使用selenium+爬虫的时候,经常会遇到一个问题,就是NoSuchElementException,定位不到元素的问题 一,打开了新页面,一般selenium点击新链接跳转打开了一个新页面,那么 ...
- 建站手册-浏览器信息:挪威的 Opera 浏览器
ylbtech-建站手册-浏览器信息:挪威的 Opera 浏览器 1.返回顶部 1. http://www.w3school.com.cn/browsers/browsers_opera.asp 2. ...
- 测开之路三十八:css布局之定位
常用的布局方式: static:静态定位(默认),什么都不用管,元素会按照默认顺序排列,排不下是会默认换行relative:相对定位(同一层),相对于某一个元素进行定位fixed:绝对定位,指定位置a ...
- Java基本数据类型内存分配
1.java程序运行时有6中地方存储数据,分别是:寄存器.栈.堆.静态存储.常量存储.非RAM(随机存储器),主要是堆与栈的存储. 2.堆与栈是java用来在RAM中存储数据的地方,java自动管 ...
- C++内存修改器开源代码
我们玩单机游戏时,游戏难度可能过大, 或者游戏已经比较熟练,想要增加游戏的玩法,这时候可以使用修改器. 内存式游戏修改器主要对游戏内存修改 修改时有两种方式,一是定时对内存数值进行修改.实现类似锁定的 ...
- [360前端星计划]BlackJack(21点)(纯JS,附总部学习笔记)
[360前端星计划]总部学习笔记(6/6) [360前端星计划]详情跳转 游戏界面预览 目录 一.游戏介绍 1.起源 2.规则 3.技巧 二.游戏设计 1.整体UI构思 2.素材采集 3.游戏总规划 ...