.c om an co ng THUẬT TOÁN ỨNG DỤNG cu u du o ng th QUY HOẠCH ĐỘNG Range Minimum Query Phạm Quang Dũng Bộ môn KHMT dungpq@soict.hust.edu.vn CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Bài toán Range Minimum Query RMQ Cho dãy a[0], a[1], …, a[N-1] Với số ≤ i < j 6 th 10 11 12 du o ng an co ng ≤ N -1, thực truy vấn RMQ(i, j) tìm trả số phần tử nhỏ dãy a[i], a[i+1],…, a[j] cu u RMQ(1,7) = RMQ(6,11) = CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Bài toán Range Minimum Query RMQ Ký hiệu M[j, i] số phần tử nhỏ dãy a[i], 10 11 12 13 14 15 an ng 10 11 12 13 14 15 10 11 12 13 14 15 cu 6 0 1 3 8 10 12 12 13 15 - 3 3 8 8 12 12 12 12 - - - 3 3 12 12 12 12 - - - - - - - 12 - - - - - - - - - - - - - - - u du o th co ng a[i+2],…, a[i+2j -1] (dãy số i có độ dài 2j) CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Bài toán Range Minimum Query RMQ Bài toán nhỏ M[0,i] = i, i = 0,…, N-1 co M[j-1,i] a[M[j-1,i]] < a[M[j-1,i+2j-1] M[j-1,i+2j-1], ngược lại th an M[j,i] = ng Công thức truy hồi i i + 2j-1 i + 2j - cu u du o ng i+2j-1 -1 M[j-1,i + 2j-1] M[j-1,i] M[j, i] CuuDuongThanCong.com https://fb.com/tailieudientucntt preprocessing(){ ng for (i = 0; i < N; i++) M[0,i] = i; c om Bài toán Range Minimum Query RMQ co for (j = 0; 2j ≤ N; j++){ an for(i = 0; i + 2j -1 < N; i++){ ng M[j,i] = M[j-1,i]; th if a[M[j-1,i]] < a[M[j-1,i+2j-1]] then{ du o }else{ } cu } u M[j,i] = M[j-1,i+2j-1]; } } CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Bài toán Range Minimum Query RMQ Truy vấn RMQ(i,j) ng k = [log(j-i+1)] co RMQ(i,j) = M[k,i] a[M[k,i]] ≤ a[M[k, j-2k+1]] ng th an M[k, j-2k+1]], ngược lại RMQ(4,14) = ? du o k = [log(14-4+1)]=3 a[7] > a[12] RMQ(4,14) = 12 cu u M[3,7] = 12 10 11 12 13 14 15 6 3 6 M[3,4] = CuuDuongThanCong.com https://fb.com/tailieudientucntt ... om Bài toán Range Minimum Query RMQ Ký hiệu M[j, i] số phần tử nhỏ dãy a[i], 10 11 12 13 14 15 an ng 10 11 12 13 14 15 10 11 12 13 14 15 cu 6 0 1 3 8 10 12 12 13 15 - 3 3 8 8 12 12 12 12 - -... 3 3 12 12 12 12 - - - - - - - 12 - - - - - - - - - - - - - - - u du o th co ng a[i +2] ,…, a[i+2j -1] (dãy số i có độ dài 2j) CuuDuongThanCong.com https://fb.com/tailieudientucntt .c om Bài toán. .. RMQ Bài toán nhỏ M[0,i] = i, i = 0,…, N-1 co M[j-1,i] a[M[j-1,i]] < a[M[j-1,i+2j-1] M[j-1,i+2j-1], ngược lại th an M[j,i] = ng Công thức truy hồi i i + 2j-1 i + 2j - cu u du o ng i+2j-1 -1