博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】552. Student Attendance Record II
阅读量:6824 次
发布时间:2019-06-26

本文共 2066 字,大约阅读时间需要 6 分钟。

题目如下:

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:

 

  1. 'A' : Absent.
  2. 'L' : Late.
  3. '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 = 2Output: 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)

 

转载于:https://www.cnblogs.com/seyjs/p/10420247.html

你可能感兴趣的文章
手势再也不是相机前的Pose,它还能指导机器人做手术!
查看>>
SoJpt Boot 2.0-3.8 发布,Spring Boot 使用 Jfinal 特性极速开发
查看>>
java.lang.RuntimeException: Fail to connect to camera service问题
查看>>
中国“芯”时代未至,何谈“互联网+”?
查看>>
STF环境问题篇(MAC)
查看>>
Android Studio 3.3.2 稳定版发布,Bug 修复版本
查看>>
Veeam成立十周年,展望未来十年的科技发展
查看>>
Apollo,让机器人开发更简单
查看>>
Linux防火墙iptables规则设置(转)
查看>>
C语言中getch()、getche()和getchar()
查看>>
厂商“阅兵”:从2015年IFA看消费电子发展新趋势
查看>>
2020年,1000亿个智能终端驱动嵌入式闪存高速发展
查看>>
精选10大机器学习开源项目 !(附链接)
查看>>
中国电信“商密云存储系统”通过国家商用密码产品鉴定
查看>>
用区块链技术养走地鸡,我认真的
查看>>
用SublimeText当Unity Shader的编辑器
查看>>
指数哥伦布编码
查看>>
数据库查询索引(sql单个索引和复合索引)
查看>>
风口更需冷静 智能家居如何跨越鸿沟?
查看>>
CISO元素周期表
查看>>