题目描述:
示例 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;
}
}