# A5 ôn bài (series) --- # BFS ## Labyrinth Dùng BFS nhưng: - trên lưới - truy vết: lưu lại hướng đi tới ô $(x,y)$ bất kì. ## Monsters BFS đa nguồn Tính khoảng cách ngắn nhất từ 1 quái vật tới ô $(x,y)$ bất kì, gọi là $d(x,y)$. Tìm chiến thuật cho người: Muốn đi tới ô $(x,y)$ vào thời điểm $i$ thì phải có $i < d(x,y)$ (tới sớm hơn hẳn) ### Sol 2 Đạt, Hiếu orz Vừa đi vừa đánh dấu bảng. Thêm toàn bộ quái vật vào queue, sau đó thêm người vào. Trong quá trình BFS, ta gán kí tự ở ô $(u,v)$ kề $(x,y)$ bằng chính kí tự ở ô $(x,y)$ (mô phỏng lại "bước đi" của người / quái vật) ## NUMK ### Trâu ### Full Coi mỗi số là một đỉnh (chỉ quan tâm số dư cho $M$). Từ một số $x$, chia $M$ dư $r$, thêm một chữ số $d_i$ vào sau nó thì được: số $10x + d_i$, chia $M$ dư $(10r + d_i) \mod M$ Ta ưu tiên thêm chữ số bé trước chữ số lớn. Dùng BFS tìm đường đi ngắn nhất từ các đỉnh ban đầu (số có 1 chữ số), đi tới đỉnh $0$ #### Chứng minh Thuật trên sẽ ưu tiên số có số lượng chữ số ít hơn. Trong những số cùng chữ số, do ta đã ưu tiên chọn chữ số **bé** hơn trước, nên sẽ được số nhỏ hơn. --- # DP ## CHIADAY sub 2: cố định x1,x2 xong x3 chính là vị trí để Sum(x3,n+1) đạt min QHĐ: Thấy được cần chia mảng thành 4 phần Đặt $dp(i,j):$ xét $i$ phần tử đầu, đang ở phần thứ $j$ thì tổng $\max =?$ ## POKEMON sub 1: duyệt n! hoán vị sub 3: Đặt dp(mask, i): tập hợp loại pokemon đã thu phục là số mask, con cuối cùng thu phục là i Có $2^m * n$ trạng thái. Công thức: từ $dp(mask,i)$ cập nhật cho $\texttt{dp(mask | (1<<t[j]), j)}$ ĐPT: $O(2^m \cdot n^2)$ ## cses1686 Lưu ý: mỗi ô chỉ tính vào tổng 1 lần. Dùng tarjan, nén các TPLT mạnh về thành 1 đỉnh. Đồ thị mới tạo được sẽ là DAG. Đặt $f(u)$: Tổng lớn nhất của đường đi bắt đầu/ kết thúc tại đỉnh $u$