cuốn sách gpt4 ai đã làm

thuật toán - Các ví dụ, bài viết, sách hay để hiểu về lập trình động

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 02:13:22 27 4
mua khóa gpt4 Nike

đóng cửa. Câu hỏi làoff-topic .Nó hiện không chấp nhận câu trả lời.




9年前关闭。










khóa. Câu hỏi này và câu trả lời của nó làbị khóaBởi vì câu hỏi này lạc đề nhưng có ý nghĩa lịch sử. Hiện tại nó không chấp nhận câu trả lời hoặc tương tác mới.








Tôi không thể hiểu cách lập trình động hoạt động như thế nào, nhưng tôi muốn nó. DP rất mạnh và có thể giải quyết các vấn đề như:

Nhận số tiền thấp nhất có thể từ chênh lệch số

Vậy bạn có thể gợi ý cho tôi khôngcuốn sách hoặc bài viết hay (tốt nhất là với các ví dụ mã thực) Điều này có giải thích lập trình động là gì không? Tôi thực sự muốn có những ví dụ đơn giản trước và sau đó tôi sẽ tiếp tục.

câu trả lời hay nhất

Lập trình độnglà một thuật toán hữu ích để tối ưu hóa các bài toán khó bằng cách chia chúng thành các bài toán con nhỏ hơn. Bằng cách lưu trữ và tái sử dụng các phần của giải pháp, nó tránh được những cạm bẫy khi sử dụng các thuật toán tham lam. Có hai loại lập trình động: từ dưới lên và từ trên xuống.
Để có thể giải được một bài toán bằng quy hoạch động, bài toán đó phải có cái gọi là kết cấu tối ưu thiên nhiên. .Điều này có nghĩa là nếu bạn chia một vấn đề thành một chuỗi các vấn đề phụ và tìm ra giải pháp tốt nhất cho từng vấn đề phụ, thì giải pháp cuối cùng sẽ đạt được bằng các giải pháp cho các vấn đề phụ này. Các vấn đề không có cấu trúc này không thể được giải quyết bằng quy hoạch động.
từ trên xuống
Từ trên xuống được biết đến nhiều hơn là sự ghi nhớ .Đó là ý tưởng lưu trữ các phép tính trong quá khứ để tránh phải tính toán lại chúng mỗi lần.
Cho một hàm đệ quy, nói:

fib(n) = 0 nếu n = 0
1 nếu n = 1
fib(n - 1) + fib(n - 2) if n >= 2
Chúng ta có thể dễ dàng viết nó một cách đệ quy từ dạng toán học của nó như sau:
hàmfib(n)
nếu(n == 0 || n == 1)
n
khác
sợi(n-1) + sợi(n-2)
Bây giờ, bất kỳ ai đã lập trình một thời gian hoặc biết đôi điều về hiệu quả thuật toán sẽ nói với bạn rằng đây là một ý tưởng tồi. Lý do là ở mỗi bước bạn phải tính lại giá trị của fib(i) trong đó i là 2..n-2.
Một ví dụ hiệu quả hơn là lưu trữ các giá trị này, tạo ra thuật toán lập trình động từ trên xuống.
m = bản đồ(int, int)
m[0] = 0
m[1] = 1
hàmfib(n)
if(m[n] không tồn tại)
m[n] = sợi(n-1) + sợi(n-2)
Bằng cách này, chúng tôi tính toán fib(i) nhiều nhất một lần.

từ dưới lên
Từ dưới lên sử dụng công nghệ bộ nhớ giống như từ trên xuống. Tuy nhiên, sự khác biệt là hoạt động từ dưới lên bằng cách sử dụng các bài toán con so sánh được gọi là sự lặp lại để tối ưu hóa kết quả cuối cùng của bạn.
Trong hầu hết các bài toán quy hoạch động từ dưới lên, bạn thường cố gắng cực tiểu hóa hoặc cực đại hóa một quyết định. Tại bất kỳ thời điểm nào, bạn đều có hai (hoặc nhiều) tùy chọn và bạn phải quyết định xem cái nào tốt hơn cho vấn đề bạn đang cố gắng giải quyết. Tuy nhiên, những quyết định này đều dựa trên những lựa chọn trước đó mà bạn đã thực hiện.
Bằng cách đưa ra quyết định tốt nhất tại mọi thời điểm (từng vấn đề phụ), bạn đảm bảo rằng kết quả tổng thể của mình là tối ưu.
Phần khó khăn nhất của những vấn đề này là tìm ra mối quan hệ truy hồi để giải quyết vấn đề.
Để trả tiền cho một loạt sách giáo khoa về thuật toán, bạn định cướp một cửa hàng với n món đồ. vấn đề là của bạn ba lô nhỏChỉ có thể chứa tối đa W kg. Biết trọng lượng (w[i]) và giá trị (v[i]) của từng vật phẩm, bạn muốn tối đa hóa giá trị chiến lợi phẩm của mình sao cho tổng trọng lượng của những vật phẩm này tối đa là W. Đối với mỗi mục, bạn phải thực hiện lựa chọn nhị phân - lấy nó hoặc bỏ nó.
Bây giờ, bạn cần tìm hiểu vấn đề phụ là gì. Là một tên trộm rất thông minh, bạn nhận ra rằng giá trị tối đa của một vật phẩm i với trọng lượng tối đa w có thể được biểu thị bằng m[i, w]. Hơn nữa, m[0, w] (0 mục có trọng số lớn nhất w) và m[i, 0] (mục i có trọng số lớn nhất 0) sẽ luôn bằng giá trị 0.
Vì thế,
m[i, w] = 0 nếu i = 0 hoặc w = 0
Sau khi đeo mặt nạ suy nghĩ đầy đủ, bạn sẽ nhận thấy rằng nếu túi của bạn chứa đầy trọng lượng tối đa, bạn không thể xem xét một món đồ mới trừ khi trọng lượng của nó nhỏ hơn hoặc bằng chênh lệch giữa trọng lượng tối đa và trọng lượng tối đa của bạn. Trọng lượng hiện tại của túi. Một tình huống khác mà bạn có thể muốn xem xét một món đồ là nếu nó nặng hơn hoặc bằng trọng lượng của một trong những món đồ trong túi nhưng có giá trị cao hơn.
 m[i, w] = 0 nếu i = 0 hoặc w = 0
m[i - 1, w] nếu w[i] > w
max(m[i - 1, w], m[i - 1, w - w[i]] + v[i]) if w[i] <= w
Đây là những mối quan hệ lặp lại được mô tả ở trên. Một khi bạn đã có những mối quan hệ này, việc viết thuật toán sẽ rất dễ dàng (và ngắn gọn!).
v = giá trị từ item1..itemn
w = trọng lượng từ item1..itemn
n = số lượng mặt hàng
W = trọng lượng tối đa của ba lô

m[n, n] = mảng(int, int)
ba lô chức năng
với w=0..W
m[0, w] = 0
với i=1 đến n
m[i, 0] = 0
với w=1..W
nếu w[i] <= w
nếu v[i] + m[i-1, w - w[i]] > m[i-1, w]
m[i, w] = v[i] + m[i-1, w - w[i]]
khác
m[i, w] = m[i-1, w]
khác
m[i, w] = c[i-1, w]

trả về m[n, n]

Các tài nguyên khác
  • Giới thiệu về thuật toán
  • Thử thách lập trình
  • Hướng dẫn thiết kế thuật toán

  • Câu hỏi ví dụ
    May mắn thay, lập trình động đã trở thành hiện thực khi nói đến lập trình cạnh tranh. kiểm tra Lập trình động trên UVAJudgeĐối với một số câu hỏi thực hành, những câu hỏi này sẽ kiểm tra khả năng của bạn trong việc thực hiện các vấn đề lập trình động và tìm ra sự lặp lại.

    Về thuật toán - ví dụ hay, bài viết, sách để hiểu về lập trình động, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/4278188/

    27 4 0
    Chứng chỉ ICP Bắc Kinh số 000000
    Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
    Xem sitemap của VNExpress