0
点赞
收藏
分享

微信扫一扫

学生出勤记录 II

诗与泡面 2021-09-21 阅读 39
今日算法
题目描述:
示例 1:
示例 2:
示例 3:
题目分析:
  • 总共的A不能超过2次:A出现0次和1次。
  • 连续的L不能超过3次:连续L出现次数0次,1次,2次。
思路一:
class Solution {
    public int mod = (int) 1e9+7;
    public int count;
    public int checkRecord(int n) {
        count = n;
        int result = dfs(0, 0, 0);
        return result;
    }
    public int dfs(int num, int absent, int late) {
        if (num == count) return 1;

        int result = 0;
        result += dfs(num + 1, absent, 0);
        if (absent < 1) { // 缺勤最多1次
            result += dfs(num + 1, 1, 0);
        }
        if (late < 2) { // 连续迟到最多2次
            result += dfs(num + 1, absent, late + 1);
        }
        result = result % mod;
        return result;
    }
}
思路二:
class Solution {
    public int mod = (int) 1e9+7;
    public int count;
    public int[][][] arr;
    public int checkRecord(int n) {
        count = n;
        arr = new int[n][2][3];
        int result = dfs(0, 0, 0);
        return result;
    }
    public int dfs(int num, int absent, int late) {
        if (num == count) return 1;
        if (arr[num][absent][late] != 0) return arr[num][absent][late]; // 对于相同num,absent,late的情况,减枝。
        int result = 0;
        result += dfs(num + 1, absent, 0);
        result %= mod;
        if (absent < 1) { // 缺勤最多1次
            result += dfs(num + 1, 1, 0);
            result %= mod;
        }
        if (late < 2) { // 连续迟到最多2次
            result += dfs(num + 1, absent, late + 1);
            result %= mod;
        }
   
        arr[num][absent][late] = result; // 记录num,absent,late情况时的数量,用于减枝。
        return result;
    }
}
举报

相关推荐

0 条评论