## Dãy đèn ### Đề Có $n$ bóng đèn, lúc đầu tắt hết. Trong mỗi lượt, có thể dùng 1 thao tác để biến một đèn: - Từ tắt $\rightarrow$ xanh - Từ xanh $\rightarrow$ đỏ - Từ đỏ $\rightarrow$ tắt Hỏi dùng đúng $t$ thao tác,có bao nhiêu cách để dãy cuối cùng có $A$ đèn xanh, $B$ đèn đỏ. ### Sol Về ý tưởng, vẫn dùng QHĐ 3 chiều $\texttt{dp(t,a,b)}$: đã qua $t$ lượt, hiện tại đang có $a$ đèn xanh, $b$ đèn đỏ. Suy ra được sẽ có $c = n-a-b$ đèn tắt. Để chuyển trạng thái, ta cứ theo 3 trường hợp của đề. ![](https://i.imgur.com/r3sIMtm.png) Hàm cộng & nhân viết riêng để đỡ lẫn & dễ nhìn hơn. ![](https://i.imgur.com/h2iKkpP.png) ### Vấn đề Mảng trên có kích thước là $600^3$, mỗi số nguyên 32-bit chiếm 4 bytes nên tổng bộ nhớ cần dùng sẽ vào $4 \times 600^3 = 864000000 \,\text{bytes} \approx 823.974609 \,\text{MB}$ Để ý rằng $\texttt{dp(t)}$ chỉ tính hoàn toàn từ $\texttt{dp(t-1)}$ nên chỉ cần hai mảng 2 chiều là đủ. Cụ thể, tạo một mảng $\texttt{cur}$ tượng trưng cho $\texttt{dp(t)}$, mảng $\texttt{nxt}$ tượng trưng cho $\texttt{dp(t+1)}$. Ta tính $nxt$ từ $\texttt{cur}$, sau đó lại gán $\texttt{cur = nxt}$ và $\texttt{nxt = \{0\}}$ để tính những trường hợp sau đó. ### Code full ![](https://hackmd.io/_uploads/H1ZosDauh.png)