You are on page 1of 3

A.

RGAME

 Sub 2:
- Quy hoạch động.
- F[l][r] : (tổng điểm thưởng lớn nhất chọn đc trong đoạn từ l đến r) * 2
- Ta nhân F[l][r] lên 2 để tránh phải xử lí số thực. Kết quả cuối cùng ta chia 2
- F[l][r] = max(F[l][r], F[l + 1][r] + 2 * a[l + 1]); (l + 1 ≤ r)
- F[l][r] = max(F[l][r], F[l][r - 1] + 2 * a[r - 1]); (l ≤ r - 1)
- F[l][r] = max(F[l][r], F[l][k - 1] + F[k + 1][r] + a[i + 1] + a[i – 1]);
(k = (l + 1) ÷ (r – 1))
- Đáp án là F[1][N] / 2
- Đpt O(n3)

 Sub3:
Thay đổi công thức quy hoạch động

(1) Chọn dần các ô từ đầu có 1 số liền kề


(2) Chọn dần các ô từ cuối có 1 số liền kề
(3) Chọn 1 số có 2 số liền kề

- dp(i, t) : đang xét đến vị trí i với trạng thái t. Với t = 0 thì ta vẫn đang chọn (1). Khi t =
1 thì ta có thể chọn (2) hoặc (3). Khi chọn (3) xong thì t sẽ quay về 0.
- Nếu t = 0 thì :
dp(i, t) = max(dp(i + 1, 0) + 2 * a[i + 1], dp(i + 1, 1));
- Ngược lại, nếu t khác 0 thì :
dp(i, t) = max(dp(i + 1, 0) + a[i - 1] + a[i + 1], dp(i + 1, 1) + 2 * a[i - 1]);

- Đpt O(N * 2)

B. Board

- Subtask 1: với điều kiện w, h ≤ 100 thì ta chỉ cần sử dụng thuật toán Loang - BFS để đánh dấu các
thành phần liên thông ko phải là vùng băng giấy. Đáp án chính là số tplt ta tìm ra

- Subtask 2 : với điều kiện n ≤ 1000, w, h ≤ 4000 thì ta ko thể dùng nguyên thuật của sub1 được nữa ta
phải cải tiến nó bằng cách sử dụng phương pháp đánh dấu cộng dồn và dùng mảng cộng dồn 2 chiều

++f[x1][y1]

--f[x1][y 1] FOR( i, 1,numRow) FOR( j, 1, numCol)

--f[x2 + 1][y1] f[i][j] += f[i][j - 1] + f[i - 1][j] - f[i - 1][j - 1];

++f[x2 + 1][y2 + 1]
Những f[i][j] != 0 thì nó là băng giấy ( Lý do tại sao lại như vậy thì các em tự suy nghĩ không nghĩ được
thì hỏi Trung Ahihi )

Sử dụng thuật bfs + (f[i][j] !=0) để bfs giảm đi độ phức tạp là sẽ qua subtask 2

- Subtask 3 : với điều kiện unlimited ta cần sử dụng RỜI RẠC HÓA kết hợp với thuật Subtask 2 để có thể
AC được ( rời rạc hóa là gì thì các em hỏi cô Hiền )

Tài liệu tham khảo : https://vnoi.info/wiki/algo/trick/Roi-rac-hoa-va-ung-dung.md

C. Lights

- Subtask 1 : với điều kiện k = 0 thì ta chỉ cần tìm được chi phí nhỏ nhất để bật các đèn thỏa mãn đề bài.
Bây giờ đến đèn thứ I thay vì chỉ gọi dp[i] là chi phí bật các đèn chiếu sao cho tất cả các con phố từ 1 > I
được chiếu sang và ta phải biết thêm một dữ kiện nữa là đèn cuối cùng được bật sáng trước I là ở đâu
để xem có cần bật đèn I hay không, ta sẽ chuyển thành dp[i] là chi phí nhỏ nhất để bật các đèn chiếu
sáng các con phố từ 1 > I và ta bật đèn i.

Ta có công thưc dp[i] = min(dp[i] , dp[j]+w[i]) (j >= i-3) (tại sao j >= i-3 thì thử nghĩ nhá :V)

Ans = min(dp[n] , dp[n-1]);

-Subtask2 :

Bây giờ k # 0, ta gọi tập s1 là những con phố bật đèn , s2 là những con phố không bật đèn => ta chỉ đổi
chỗ những phần tử của tập s1 với tập s2 chứ không đổi chỗ các phần tử trong cùng một tập(vì nó có ích
gì đâu :V). Vẫn tương tự như trên, ta có mảng dp[i][j][k] :

- Chi phí để thắp sáng các con phố từ 1 đến I , bật đèn tại thành phố i
- Đã chọn j phần tử để đổi từ tập s1 sang s2
- Đã chọn k phần tử để đổi từ tập s2 sang s1

*Chú ý là ở đây ta chọn (có thể dung để đổi sau) chứ không phải đổi luôn nên j không bắt buộc phải = k

Bây giờ đến đèn I , ta có hai lựa chọn bật đèn i, chọn một thằng trong tập s2 để đổi với nó và bật đèn.

Sau đó ta chọn những đèn chưa bật và thử xem có nên đổi nó từ s2 vào s1 không. Gọi k là đèn cuối cùng
được bật trước I (k >= i-3) thì ta chỉ nên xét những đèn chưa bật trong khoảng [k+1 , i-1] vì nếu các đèn
đó nằm trong khoảng [1 , k-1] thì đã được xét khi ta tính đến đèn k rồi

Ta có một lưu ý rằng khi ta đổi một đèn từ s1 vào s2 nghĩa là ta sẽ không bật đèn đó, khi đó chi phí = 0 ,
còn khi ta đổi một đèn từ s2 sang s1 nghĩa là ta sẽ bật đèn đó nên ta sẽ cộng luôn chi phí để bật đèn vào.
:V sol chỉ đến đây thui nên, các th sẽ xảy ra ntn thì các em suy nghĩ thêm nhá, không nghĩ đc thì hỏi chị Q

You might also like