thảo luận [Học Tập] Topic thuật toán

:matrix: bất cứ khi nào có thể
Vì nếu recursion quá sâu thì sẽ gặp đủ thứ lỗi mà cách giải quyết tốt nhất vẫn là đừng đệ quy
có tips hay tài liệu nào để tham khảo chuyển đổi đệ quy sang loop ko bác :stick:
nhiều bài e vẫn chưa mường tượng ra cách đổi như thế nào nữa
 
có tips hay tài liệu nào để tham khảo chuyển đổi đệ quy sang loop ko bác :stick:
nhiều bài e vẫn chưa mường tượng ra cách đổi như thế nào nữa
đệ quy sang loop độ phức tạp tương đương thì dùng stack, queue. Còn cách sang quy hoạch động là khó nghĩ hơn và đương nhiên là nhanh hơn, tốn ít bộ nhớ hơn
 
Em mới nhập môn khoa học máy tính ạ, có bài tập sau em phải trình bày ra slide, về cơ bản em biết cách giải nhưng trình bày thuật toán ra thì em chưa biết thế nào, các bác giúp em với :( em cảm ơn
View attachment 808107
sao mỗi 2 lần là được mà, từ hộp 11 chuyển 2 sang hộp 6, lần 2 chuyển 1 sang hộp 7. 2 lần là có 3 hộp 8 rồi
 
Tks bác, :burn_joss_stick: để e tham khảo.
Hiện tại tất cả các bài QHĐ đã làm đều bằng đệ quy + memoize với hash table. Nhưng có vẻ vẫn chưa tối ưu lắm bù lại dễ suy nghĩ hơn

Phải luyện tập để thay đổi tư duy, thay vì nghĩ theo hướng top-down thì nghĩ theo hướng bottom-up. Bottom-up DP không phải là recursive -> iterative.
 
ae thử bài này, đề bài đơn giản: "có bao nhiêu ước của N giai thừa mà chia hết cho D"


1633941139881.png
 
Các anh giúp e làm bài này bằng C với mà không dùng tới mảng ạ, e lên gg tìm ng ta toàn hướng dẫn dùng mảng để giải ạ:((. Nếu làm bằng if else thì càng tốt, em cảm ơn
Capture.PNG
 
Mình đoán là bạn chưa search đúng keyword hoặc có thể đọc lời giải không hiểu nên mình code hộ bạn vậy
:big_smile:

JavaScript:
function median(a, b, c, d, e) {
  if (a >= b) { /* 1st comparision */
    a = a + b; b = a - b; a = a - b; // swap
  }
  if (c >= d) { /* 2nd comparision */
    c = c + d; d = c - d; c = c - d;
  }
  // now we have: a < b, c < d
  if (b >= d) { /* 3rd comparision */
    a = a + c; c = a - c; a = a - c;
    b = b + d; d = b - d; b = b - d;
  }
  // now d > (a and b and c) => d is not median
  if (c >= e) { /* 4th comparision */
    c = c + e; e = c - e; c = c - e;
  }
  // now we have: a < b, c < e
  if (b > e) { /* 5th comparision */
    if (a > e) return a; else return e; /* 6th comparision */
  } else { // => e is not median
    if (b > c) return b; else return c; /* 6th comparision */
  }
}

Còn đây là link lời giải https://cs.stackexchange.com/a/45379.
 
bài này làm quy hoạch động là xong mà.
Code:
distant[i][j] = path[i][j] + min(distant[i+1][j], distant[i][j+1])
Thêm điều kiện xử lý mấy trường hợp biên nữa là xong.
mình nghĩ đây là bài toán tìm đường đi ngắn nhất code của mình thì như này
Code:
while q:
        curr = q.popleft()
        i = curr.x
        j = curr.y

        n = matrix[i][j]
        if n == 'end':
            return

        row = [0, 1]
        col = [1, 0]
        for k in range(len(row)):
            x = i + row[k]
            y = j + col[k]

            if (0 <= x < N) and (0 <= y < N):
                next = Cell(x, y, curr)
                key = (next.x, next.y)

                if key not in visited:
                    q.append(next)
                    visited.add(key)
 
Back
Top