并发编程中的状态机
使用状态机思路解决一个并行问题。 题目可以描述为:进程A每轮循环产生一个 H,进程 B 每轮循环产生一个 O,需要保证每产生 3 个元素时都由 2 个 H 和 1 个 O 组成。 ...
使用状态机思路解决一个并行问题。 题目可以描述为:进程A每轮循环产生一个 H,进程 B 每轮循环产生一个 O,需要保证每产生 3 个元素时都由 2 个 H 和 1 个 O 组成。 ...
爬楼梯的加强版本,分别提前生成三个字母和四个字母的 fib 数组,然后分组统计后相乘。代码如下: class Solution { public: int countTexts(string pressedKeys) { int f1[100005]; int f2[100005]; memset(f1, 0, sizeof f1); memset(f2, 0, sizeof f2); f1[0] = 1; f1[1] = 2; f1[2] = 4; f2[0] = 1; f2[1] = 2; f2[2] = 4; f2[3] = 8; for (int i=3; i<100005; ++i) f1[i] = (0LL + f1[i-1] + f1[i-2] + f1[i-3])%int(1e9+7); for (int i=4; i<100005; ++i) f2[i] = (0LL + f2[i-1] + f2[i-2] + f2[i-3] + f2[i-4])%int(1e9+7); int ans = 1; int cur_ch = pressedKeys[0]; int cur_cnt = 1; for (int i=1; i<pressedKeys.size(); ++i) { if (pressedKeys[i] != cur_ch) { if (cur_ch == '7' || cur_ch == '9') ans = 1LL *ans * f2[cur_cnt - 1] % int(1e9+7); else ans = 1LL *ans * f1[cur_cnt - 1] % int(1e9+7); cur_ch = pressedKeys[i]; cur_cnt = 1; } else { ++ cur_cnt; } } if (cur_ch == '7' || cur_ch == '9') ans = 1LL * ans * f2[cur_cnt - 1] % int(1e9+7); else ans = 1LL * ans * f1[cur_cnt - 1] % int(1e9+7); return ans; } };