zoukankan      html  css  js  c++  java
  • 552 Student Attendance Record II 学生出勤记录 II

    给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量。 答案可能非常大,你只需返回结果mod 109 + 7的值。
    学生出勤记录是只包含以下三个字符的字符串:
        1.'A' : Absent,缺勤
        2.'L' : Late,迟到
        3.'P' : Present,到场
    如果记录不包含多于一个'A'(缺勤)或超过两个连续的'L'(迟到),则该记录被视为可奖励的。
    示例:
    输入: n = 2
    输出: 8
    解释:
    有8个长度为2的记录将被视为可奖励:
    "PP" , "AP", "PA", "LP", "PL", "AL", "LA", "LL"
    只有"AA"不会被视为可奖励,因为缺勤次数超过一次。
    注意:n 的值不会超过100000。
    详见:https://leetcode.com/problems/student-attendance-record-ii/description/

    C++:

    class Solution {
    public:
        int checkRecord(int n) 
        {
            int M = 1000000007;
            int dp[n + 1][2][3] = {0};
            for (int j = 0; j < 2; ++j) 
            {
                for (int k = 0; k < 3; ++k) 
                {
                    dp[0][j][k] = 1;
                }
            }
            for (int i = 1; i <= n; ++i)
            {
                for (int j = 0; j < 2; ++j) 
                {
                    for (int k = 0; k < 3; ++k)
                    {
                        int val = dp[i - 1][j][2];
                        if (j > 0)
                        {
                            val = (val + dp[i - 1][j - 1][2]) % M;
                        }
                        if (k > 0)
                        {
                            val = (val + dp[i - 1][j][k - 1]) % M;
                        }
                        dp[i][j][k] = val;
                    }
                }
            }
            return dp[n][1][2];
        }
    };
    

     参考:http://www.cnblogs.com/grandyang/p/6866756.html

  • 相关阅读:
    codevs 3115 高精度练习之减法 swap
    codevs 3116 高精度练习之加法
    poj 3984 迷宫问题
    codevs m进制转化成10进制
    codevs 1214 线段覆盖
    codevs 3143 二叉树的序遍历
    codevs 3145 汉诺塔
    HDU 5093 Battle ships [二分图匹配]
    HDU 5074 Hatsune Miku [dp] ——2014鞍山现场赛E题
    ZOJ 3793 First Digit (逗比题)
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8922223.html
Copyright © 2011-2022 走看看