Category: LẬP TRÌNH

  • MỘT SỐ BÀI TOÁN QUY HOẠCH ĐỘNG ĐIỂN HÌNH

    MỘT SỐ BÀI TOÁN QUY HOẠCH ĐỘNG ĐIỂN HÌNH

    MỘT SỐ BÀI TOÁN QUY HOẠCH ĐỘNG ĐIỂN HÌNH

    Quy hoạch động là gì?

    Theo wiki, quy hoạch động (tiếng Anh: dynamic programming) là một phương pháp giảm thời gian chạy của các thuật toán thể hiện các tính chất của các bài toán con gối nhau (overlapping subproblem) và cấu trúc con tối ưu (optimal substructure).

    Cấu trúc con tối ưu có nghĩa là các lời giải tối ưu cho các bài toán con có thể được sử dụng để tìm các lời giải tối ưu cho bài toán toàn cục. Ví dụ, đường đi ngắn nhất tới một đỉnh trong một đồ thị có thể được tìm thấy bằng cách: trước hết tính đường đi ngắn nhất tới đích từ tất cả các đỉnh kề nó, rồi dùng kết quả này để chọn đường đi toàn cục tốt nhất, như trong hình sau.

    MỘT SỐ BÀI TOÁN QUY HOẠCH ĐỘNG ĐIỂN HÌNH 1

    Nói chung, ta có thể giải một bài toán với cấu trúc con tối ưu bằng một quy trình ba bước:

    1. Chia bài toán thành các bài toán con nhỏ hơn.
    2. Giải các bài toán này một cách tối ưu bằng cách sử dụng đệ quy quy trình ba bước này.
    3. Sử dụng các kết quả tối ưu đó để xây dựng một lời giải tối ưu cho bài toán ban đầu.

    Các bài toán con được giải bằng cách chia chúng thành các bài toán nhỏ hơn, và cứ tiếp tục như thế, cho đến khi ta đến được trường hợp đơn giản dễ tìm lời giải.

    bài toán quy hoạch động

    Nói rằng một bài toán có các bài toán con trùng nhau có nghĩa là mỗi bài toán con đó được sử dụng để giải nhiều bài toán lớn hơn khác nhau. Ví dụ, trong dãy Fibonacci, F3 = F1 + F2 và F4 = F2 + F3 — khi tính mỗi số đều phải tính F2. Vì tính F5 cần đến cả F3 và F4, một cách tính F5 một cách ngây thơ có thể sẽ phải tính F2 hai lần hoặc nhiều hơn. Điều này áp dụng mỗi khi có mặt các bài toán con gối nhau: một cách tiếp cận ngây thơ có thể tốn thời gian tính toán lại lời giải tối ưu cho các bài toán con mà nó đã giải.

    Xem thêm: Giải thuật Đệ quy là gì?

    Dãy con đơn điệu dài nhất

    1. Mô hình

    Cho dãy a_1, a_2,… a_n. Hãy tìm một dãy con tăng có nhiều phần tử nhất của nó.

    Đặc trưng:

    • Các phần tử trong dãy kết quả chỉ xuất hiện một lần. Vì vậy phương pháp làm là ta sẽ dùng vòng lặp for duyệt qua các phần tử a_i trong dãy, khác với các bài toán của mô hình 4 (đặc trưng là bài toán đổi tiền), các phần tử trong dãy có thể được chọn nhiều lần nên ta thực hiện bằng phương pháp cho giá trị cần quy đổi tăng dần từng đơn vị.
    • Thứ tự của các phần tử được chọn phải được giữ nguyên so với dãy ban đầu.

    Đặc trưng này có thể mất đi trong một số bài toán khác tùy vào yêu cầu cụ thể, chẳng hạn bài Tam giác bao nhau.

    2. Công thức quy hoạch động

    Hàm mục tiêu: f = độ dài dãy con.

    Vì độ dài dãy con chỉ phụ thuộc vào một yếu tố là dãy ban đầu nên bảng phương án là bảng một chiều. Gọi L(i)độ dài dãy con tăng dài nhất, các phần tử lấy trong miền từ a_1đến a_i và phần tử cuối cùng là a_i.

    Nhận xét với cách làm này ta đã chia bài toán lớn (dãy con của n số) thành các bài toán con cùng kiểu có kích thước nhỏ hơn (dãy con của dãy i số). Vấn đề là công thức truy hồi để phối hợp kết quả của các bài toán con.

    Ta có công thức QHĐ để tính L(i) như sau:

    • L(1) = 1. (Hiển nhiên)
    • L(i) = max(1, L(j)+1) với mọi phần tử j thỏa mãn 0<j<ia_j <= a_i.

    Tính L(i): Phần tử đang được xét là a_i. Ta tìm đến phần tử a_j < a_i L(j) lớn nhất. Khi đó nếu bổ sung a_i vào sau dãy con ...a_j ta sẽ được dãy con tăng dần dài nhất xét từ a_1đến a_i.

    3. Cài đặt

    Bảng phương án là một mảng một chiều L để lưu trữ các giá trị của hàm QHĐ L(i). Đoạn chương trình tính các giá trị của mảng L như sau:

    for i: = 1 to n do begin
    L[i]: = 1;
    for j:=1 to i–1 do
    if (a[j]<=a[i]) and (L[i]<L[j]+1) then
    L[i]:=L[j]+1;
    end;

    Như vậy chi phí không gian của bài toán là O(n), chi phí thời gian là O(n2). Có một phương pháp cài đặt tốt hơn so với phương pháp trên, cho chi phí thời gian là O(n log(n)).

    4. Một số bài toán khác

    Bài toán dãy con đơn điệu tăng dài nhất có biến thể đơn giản nhất là bài toán dãy con đơn điệu giảm dài nhất, tuy nhiên chúng ta có thể coi chúng như là một. Sau đây là một số bài toán khác.

    a) Bố trí phòng họp (mất tính thứ tự so với dãy ban đầu)

    n cuộc họp, cuộc họp thứ i bắt đầu vào thời điểm a_i và kết thúc ở thời điểm b_i. Do chỉ có một phòng hội thảo nên hai cuộc họp bất kì sẽ được cùng bố trí phục vụ nếu khoảng thời gian làm việc của chúng chỉ giao nhau tại đầu mút. Hãy bố trí phòng họp để phục vụ được nhiều cuộc họp nhất.

    Hướng dẫn: Sắp xếp các cuộc họp tăng dần theo thời điểm kết thúc b_i. Thế thì cuộc họp i sẽ bố trí được sau cuộc họp j nếu và chỉ nếu j<i và b_j <= a_i. Yêu cầu bố trí được nhiều cuộc họp nhất có thể đưa về việc tìm dãy các cuộc họp dài nhất thoả mãn điều kiện trên.

    b) Cho thuê máy

    Trung tâm tính toán hiệu năng cao nhận được đơn đặt hàng của n khách hàng. Khách hàng i muốn sử dụng máy trong khoảng thời gian từ a_i đến b_i và trả tiền thuê là c_i. Hãy bố trí lịch thuê máy để tổng số tiền thu được là lớn nhất mà thời gian sử dụng máy của hai khách hàng bất kì được phục vụ đều không giao nhau (cả trung tâm chỉ có một máy cho thuê).

    Hướng dẫn: Tương tự như bài toán a), nếu sắp xếp các đơn đặt hàng theo thời điểm kết thúc, ta sẽ đưa được bài toán b) về bài toán tìm dãy con có tổng lớn nhất. Bài toán này là biến thể của bài toán tìm dãy con tăng dài nhất, ta có thể cài đặt bằng đoạn chương trình như sau:

    for i:=1 to n do begin
    L[i]:=c[i];
    for j:=1 to i–1 do
    if (b[j]<=a[i]) and (L[i]<L[j]+c[i]) then
    L[i]:=L[j]+c[i];
    end;

    c) Dãy tam giác bao nhau

    Cho n tam giác trên mặt phẳng. Tam giác i bao tam giác j nếu ba đỉnh của tam giác j đều nằm trong tam giác i (có thể nằm trên cạnh). Hãy tìm dãy tam giác bao nhau có nhiều tam giác nhất.

    Hướng dẫn: Sắp xếp các tam giác tăng dần về diện tích. Khi đó tam giác i sẽ bao tam giác j nếu j<i và ba đỉnh của j nằm trong i. Từ đó có thể đưa về bài toán tìm dãy “tăng” dài nhất.

    Việc kiểm tra điểm M có nằm trong tam giác ABC không có thể dựa trên phương pháp tính diện tích: Điểm M nằm trong nếu S(ABC) = S(ABM) + S(ACM) + S(BCM).

    Bài toán có một số biến thể khác như tìm dãy hình tam giác, hình chữ nhật… bao nhau có tổng diện tích lớn nhất.

    d) Dãy số WAVIO

    Dãy số Wavio là dãy số nguyên thỏa mãn các tính chất, các phần tử đầu sắp xếp thành một dãy tăng dần đến một phần tử đỉnh sau đó giảm dần. Ví dụ dãy số 1 2 3 4 5 2 1 là dãy Wavio độ dài 7.

    Cho một dãy gồm N số nguyên, hãy chỉ ra một dãy con WAVIO có độ dài lớn nhất trích ra từ dãy đó.

    Hướng dẫn: L1[i] là mảng ghi độ dài lớn nhất của 1 dãy con tăng dần trích ra từ dãy N phần tử kể từ phần tử 1 đến phần tử ai. L2[i]: mảng ghi độ dài lớn nhất của dãy con giảm dần trích ra từ dãy N phần tử kể từ phần tử aN đến ai. Ta tìm phần tử j trong 2 mảng L1, L2 thỏa mãn L1[j]+L2[j] lớn nhất.

    e) Xếp các khối đá

    Cho N khối đá (N≤5000). Các khối đá đều có dạng hình hộp chữ nhật và được đặc trưng bới 3 kích thước: dài, rộng, cao. Một cách xây dựng tháp là một cách đặt một số các khối đá trong các khối đá đã cho chồng lên nhau theo quy tắc:

    • Chiều cao mỗi khối đá là kích thước nhỏ nhất trong 3 kích thước.
    • Các mép của khối đá được đặt song song với nhau sao cho không có phần nào của khối trên nằm chìa ra ngoài khối dưới.

    a) Hãy chỉ ra cách để xây dựng được một cái tháp sao cho số khối đá được dùng là nhiều nhất.

    b) Hãy chỉ ra cách để xây dựng được một cái tháp sao cho chiều cao của cái tháp là cao nhất.

    Dữ liệu vào TOWER.INP có cấu trúc như sau:

    • Dòng đầu là số N.
    • N dòng sau dòng i ghi 3 số nguyên ≤ 255 là 3 kích thước của khối đá i.

    Dữ liệu ra: TOWER1.OUT, TOWER2.OUT ghi theo quy cách:

    • Dòng đầu ghi số các khối đá được chọn theo thứ tự dùng để xây tháp từ chân lên đỉnh.
    • Các dòng sau ghi các khối được chọn, mỗi khối đá ghi 4 số T, D, R, C trong đó T là số thứ tự của mỗi khối đá. D, R, C là kích thước của khối đá tương ứng.

    II. Vali (B)

    1. Mô hình

    Có n đồ vật, vật thứ i có trọng lượng a[i] và giá trị b[i]. Hãy chọn ra một số các đồ vật, mỗi vật một cái để xếp vào 1 vali có trọng lượng tối đa W sao cho tổng giá trị của vali là lớn nhất.

    2. Công thức

    Hàm mục tiêu: f: tổng giá trị của vali.

    Nhận xét: giá trị của vali phụ thuộc vào 2 yếu tố: có bao nhiêu vật đang được xét và trọng lượng của các vật. Do đó bảng phương án sẽ là bảng 2 chiều.

    L[i,j]: tổng giá trị lớn nhất của vali khi xét từ vật 1..vật i và trọng lượng của vali chưa vượt quá j. Chú ý rằng khi xét đến L[i,j] thì các giá trị trên bảng phương án đều đã được tối ưu.

    Tính L[i,j]: vật đang xét là ai với trọng lượng của vali không được quá j. Có 2 khả năng xảy ra:

    • Nếu chọn aiđưa vào vali, trọng lượng vali trước đó phải ≤ j-a[i]. Vì mỗi vật chỉ được chọn 1 lần nên giá trị lớn nhất của vali lúc đó là L[i-1,j-a[i]) + b[i]
    • Nếu không chọn ai , trọng lượng của vali là như cũ (như lúc trước khi chọn ai ): L[i-1,j].

    Tóm lại ta có L[i,j]=max(L(i-1,j-a[i]) + b[i], L[i-1,j]).

    3. Cài đặt

    For i:=1 to n do
    For j:=1 to W do
    If b[i]<=j then
    L[i,j]:=max(L(i-1,j-a[i]) + b[i], L[i-1,j])
    else L[i,j]:=L[i-1,j];

    4. Một số bài toán khác

    a) Dãy con có tổng bằng S

    Cho dãy a1,a2,..an. Tìm một dãy con của dãy đó có tổng bằng S.

    Hướng dẫn
    Đặt L[i,t)=1 nếu có thể tạo ra tổng t từ một dãy con của dãy gồm các phần tử a1,a2,..ai. Ngược lại thì L[i,t)=0. Nếu L[n,S)=1 thì đáp án của bài toán trên là “có”.

    Ta có thể tính L[i,t] theo công thức: L[i,t]=1 nếu L[i–1,t]=1 hoặc L[i–1,t–a[i]]=1.

    Cài đặt

    Nếu áp dụng luôn công thức trên thì ta cần dùng bảng phương án hai chiều. Ta có thể nhận xét rằng để tính dòng thứ i, ta chỉ cần dòng i–1. Bảng phương án khi đó chỉ cần 1 mảng 1 chiều L[0..S] và được tính như sau:

    L[t]:=0; L[0]:=1;
    for i: = 1 to n do
    for t: = S downto a[i] do
    if (L[t]=0) and (L[t–a[i]]=1) then L[t]:=1;

    Dễ thấy chi phí không gian của cách cài đặt trên là O(m), chi phí thời gian là O(nm), với m là tổng của n số. Hãy tự kiểm tra xem tại sao vòng for thứ 2 lại là for downto chứ không phải là for to.

    b) Chia kẹo

    Cho n gói kẹo, gói thứ i có ai viên. Hãy chia các gói thành 2 phần sao cho chênh lệch giữa 2 phần là ít nhất.

    Hướng dẫn: Gọi T là tổng số kẹo của n gói. Chúng ta cần tìm số S lớn nhất thoả mãn:

    • S≤T/2.
    • Có một dãy con của dãy a có tổng bằng S.

    Khi đó sẽ có cách chia với chênh lệch 2 phần là T–2S là nhỏ nhất và dãy con có tổng bằng S ở trên gồm các phần tử là các gói kẹo thuộc phần thứ nhất. Phần thứ hai là các gói kẹo còn lại.

    c) Market (Olympic Balkan 2000)

    Người đánh cá Clement bắt được n con cá, khối lượng mỗi con là ai, đem bán ngoài chợ. Ở chợ cá, người ta không mua cá theo từng con mà mua theo một lượng nào đó. Chẳng hạn 3kg, 5kg…

    Ví dụ: có 3 con cá, khối lượng lần lượt là: 3, 2, 4. Mua lượng 6 kg sẽ phải lấy con cá thứ 2 và và thứ 3. Mua lượng 3 kg thì lấy con thứ nhất. Không thể mua lượng 8 kg.

    Nếu bạn là người đầu tiên mua cá, có bao nhiêu lượng bạn có thể chọn?

    Hướng dẫn: Thực chất bài toán là tìm các số S mà có một dãy con của dãy a có tổng bằng S. Ta có thể dùng phương pháp đánh dấu của bài chia kẹo ở trên rồi đếm các giá trị t mà L[t]=1.

    d) Điền dấu

    Cho n số tự nhiên a1,a2,. ..,an. Ban đầu các số được đặt liên tiếp theo đúng thứ tự cách nhau bởi dấu “?”: a1?a2?…?an. Cho trước số nguyên S, có cách nào thay các dấu “?” bằng dấu + hay dấu – để được một biểu thức số học cho giá trị là S không?

    Hướng dẫn: Đặt L(i,t)=1 nếu có thể điền dấu vào i số đầu tiên và cho kết quả bằng t. Ta có công thức sau để tính L:

    • L(1,a[1]) =1.
    • L(i,t)=1 nếu L(i–1,t+a[i])=1 hoặc L(i–1,t–a[i])=1.

    Nếu L(n,S)=1 thì câu trả lời của bài toán là có. Khi cài đặt, có thể dùng một mảng 2 chiều (lưu toàn bộ bảng phương án) hoặc 2 mảng một chiều (để lưu dòng i và dòng i–1). Chú ý là chỉ số theo t của các mảng phải có cả phần âm (tức là từ –T đến T, với T là tổng của n số), vì trong bài này chúng ta dùng cả dấu – nên có thể tạo ra các tổng âm.

    Bài này có một biến thể là đặt dấu sao cho kết quả là một số chia hết cho k. Ta có thuật giải tương tự bài toán trên bằng cách thay các phép cộng, trừ bằng các phép cộng và trừ theo môđun k và dùng mảng đánh dấu với các giá trị từ 0 đến k–1 (là các số dư có thể có khi chia
    cho k). Đáp số của bài toán là L(n,0).

    e) Expression (ACM 10690)

    Cho n số nguyên. Hãy chia chúng thành 2 nhóm sao cho tích của tổng 2 nhóm là lớn nhất.

    Hướng dẫn: Gọi T là tổng n số nguyên đó. Giả sử ta chia dãy thành 2 nhóm, gọi S là tổng của một nhóm, tổng nhóm còn lại là T–S và tích của tổng 2 nhóm là S*(T–S). Bằng phương pháp đánh dấu ta xác định được mọi số S là tổng của một nhóm (như bài Market) và tìm số S sao
    cho S*(T–S) đạt max.

    III. Biến đổi xâu

    1. Mô hình

    Cho 2 xâu X,F. Xâu nguồn có n kí tự X1X2…Xn , xâu đích có m kí tự F1F2…Fm. Có 3 phép biến đổi:

    • Chèn một kí tự vào sau kí tự thứ i: I i C
    • Thay thế kí tự ở vị trí thứ i bằng kí tự C: R i C.
    • Xoá kí tự ở vị trí thứ i. D i

    Hãy tìm số ít nhất các phép biến đổi để biến xâu X thành xâu F.

    Hướng dẫn:

    Hàm mục tiêu: f: số phép biến đổi.

    Dễ thấy số phép biến đổi phụ thuộc vào vị trí i đang xét của xâu X và vị trí j đang xét cuả xâu F. Do vậy để cài đặt cho bang phương án ta sẽ dùng mảng 2 chiều Gọi L(i,j) là số phép biến đổi ít nhất để biến xâu X(i) gồm i kí tự phần đầu của X (X(i)=X[1..i]) thành xâu F(j) gồm j kí tự phần đầu của F(F(j) =F[1..j]). Dễ thấy F(0,j)=j và F(i,0)=i.

    Có 2 trường hợp xảy ra:

    Nếu X[i]=F[j]:

    X1X2Xi-1 Xi
    F1F2Fj-1 Xi
    thì ta chỉ phải biến đổi xâu X(i-1) thành xâu Y(j-1). Do đó F(i,j)=F(i-1,j-1).

    Ngược lại, ta có 3 cách biến đổi:

    Xoá kí tự X[i]: X1X2Xi-1 Xi
    F1F2Fj-1 Fj
    Xâu X(i-1) thành F(j). Khi đó F(i,j)=F(i-1,j)+1.(Cộng 1 là do ta đã dùng 1 phép xóa)
    Thay thế X[i] bởi F[j]: X1X2Xi-1 Fj

    F1F2Fj-1 Fj
    Xâu X(i-1) thành F(j-1). Khi đó F(i,j)=F(i-1,j-1)+1.
    Chèn F[j] vào X(i): X1X2Xi-1XiFj

    F1F2Fj-1 Fj
    Xâu X(i) thành Y(j-1). Khi đó F(i,j)=F(i,j-1)+1.
    Tổng kết lại, ta có công thức QHĐ:

    • F(0,j)=j
    • F(i,0)=i
    • F(i,j) =F(i-1,j-1) nếu X[i] = Y[j].
    • F(i,j) = min(F(i-1,j),F(i,j-1),F(i-1,j-1))+1 nếu X[i]≠Y[j].

    Bài này ta có thể tiết kiệm biến hơn bằng cách dùng 2 mảng 1 chiều tính lẫn nhau và một mảng đánh dấu 2 chiều để truy vết.

    4. Một số bài toán khác

    a) Xâu con chung dài nhất

    Cho 2 xâu X,Y. Hãy tìm xâu con của X và của Y có độ dài lớn nhất.

    Công thức QHĐ
    Gọi L(i,j) là độ dài xâu con chung dài nhất của xâu X(i) gồm i kí tự phần đầu của X (X(i)=
    X[1..i]) và xâu Y(j) gồm j kí tự phần đầu của Y (Y(j) =Y[1..j]).
    Ta có công thức quy hoạch động như sau:
    • L(0,j)=L(i,0)=0.
    • L(i,j) = L(i-1,j-1)+1 nếu X[i] = Y[j].
    • L(i,j) = max(L(i-1,j), L(i,j-1)) nếu X[i]≠Y[j].
    Cài đặt
    Bảng phương án là một mảng 2 chiều L[0..m,0..n] để lưu các giá trị của hàm QHĐ L(i,j).
    Đoạn chương trình cài đặt công thức QHĐ trên như sau:
    for i:=0 to m do L[i,0]:=0;
    for j:=0 to n do L[0,j]:=0;
    for i:=1 to m do
    for j:=1 to n do
    if X[i]=Y[j] then
    L[i,j]:=L[i–1,j–1]+1
    else
    L[i,j]:=max(L[i–1,j],L[i,j–1]]);
    Như vậy chi phí không gian của bài toán là O(n2), chi phí thời gian là O(n2). Có một phương
    pháp cài đặt tốt hơn, chỉ với chi phí không gian O(n) dựa trên nhận xét sau:
    để tính ô L[i,j]
    của bảng phương án, ta chỉ cần 3 ô L[i–1,j–1],L[i–1,j] và L[i,j–1]. Tức là để tính dòng L[i]
    thì chỉ cần dòng L[i–1]
    . Do đó ta chỉ cần 2 mảng 1 chiều để lưu dòng vừa tính (P) và dòng
    đang tính (L) mà thôi. Cách cài đặt mới như sau:
    for j:=0 to n do P[j]:=0;
    for i:=1 to m do begin
    L[0]: = 0;
    for j:=1 to n do
    if X[i]=Y[j] then
    L[i,j]:=P[j–1]+1
    else L[i,j]:=max(P[j], L[j–1]);
    P: = L;
    end;

    c) Bắc cầu

    Hai nước Anpha và Beta nằm ở hai bên bờ sông Omega, Anpha nằm ở bờ bắc và có M thành phố được đánh số từ 1 đến m, Beta nằm ở bờ nam và có N thành phố được đánh số từ 1 đến n (theo vị trí từ đông sang tây). Mỗi thành phố của nước này thường có quan hệ kết nghĩa với một số thành phố của nước kia. Để tăng cường tình hữu nghị, hai nước muốn xây các cây cầu bắc qua sông, mỗi cây cầu sẽ là nhịp cầu nối 2 thành phố kết nghĩa. Với yêu cầu là các cây cầu không được cắt nhau và mỗi thành phố chỉ là đầu cầu cho nhiều nhất là một cây cầu, hãy chỉ ra cách bắc cầu được nhiều cầu nhất.

    Hướng dẫn: Gọi các thành phố của Anpha lần lượt là a1,a2,…am; các thành phố của Beta là
    b
    1,b2,…bn. Nếu thành phố ai và bj kết nghĩa với nhau thì coi ai bằng” bj. Để các cây cầu
    không cắt nhau, nếu ta đã chọn cặp thành phố (a
    i,bj) để xây cầu thì cặp tiếp theo phải là cặp
    (a
    u,bv) sao cho u>i và v>j. Như vậy các cặp thành phố được chọn xây cầu có thể coi là một
    dãy con chung của hai dãy a và b
    .

    Bài toán của chúng ta trở thành bài toán tìm dãy con chung dài nhất, ở đây hai phần tử “bằng” nhau nếu chúng có quan hệ kết nghĩa.

    d) Palindrom (IOI 2000)

    Một xâu gọi là xâu đối xứng (palindrom) nếu xâu đó đọc từ trái sang phải hay từ phải sang
    trái đều như nhau. Cho một xâu S, hãy tìm số kí tự ít nhất cần thêm vào S để S trở thành xâu
    đối xứng.
    Hướng dẫn: Bài toán này có một công thức QHĐ như sau:
    Gọi L(i,j) là số kí tự ít nhất cần thêm vào xâu con S[i..j] của S để xâu đó trở thành đối xứng.
    Đáp số của bài toán sẽ là L(1,n) với n là số kí tự của S. Ta có công thức sau để tính L(i,j):
    • L(i,i)=0.
    • L(i,j)=L(i+1,j–1) nếu S[i]=S[j]
    • L(i,j)=max(L(i+1,j), L(i,j–1)) nếu S[i]≠S[j]
    Bạn đọc dễ dàng có thể kiểm chứng công thức đó. Ta có thể cài đặt trực tiếp công thức đó
    bằng phương pháp đệ quy có nhớ. Tuy nhiên khi đó chi phí không gian là O(n
    2). Có một
    phương pháp cài đặt tiết kiệm hơn (bạn đọc có thể tham khảo ở bài báo trên của thầy Trần Đỗ
    Hùng), tuy nhiên phương pháp đó khá phức tạp.
    Ta có thuật toán đơn giản hơn như sau:
    Gọi P là
    xâu đảo của S và T là xâu con chung dài nhất của S và P. Khi đó các kí tự của S
    không thuộc T cũng là các kí tự cần thêm vào để S trở thành đối xứng. Đáp số của bài toán sẽ
    là n–k, với k là độ dài của T.
    Ví dụ: S=
    edbabcd, xâu đảo của S là P=dcbabde. Xâu con chung dài nhất của S và P là
    T=
    dbabd. Như vậy cần thêm 2 kí tự là e c vào để S trở thành xâu đối xứng.

    IV. Vali (A)

    1. Mô hình

    Cho n vật, vật i nặng ai và có giá trị bi. Hãy chọn ra một số vật để cho vào balô sao cho tổng
    khối lượng không vượt quá W và tổng giá trị là lớn nhất. Chú ý rằng mỗi vật có thể được chọn
    nhiều lần.

    2. Công thức

    Gọi L(i,j) là tổng giá trị lớn nhất khi được chọn i vật từ 1 đến i cho vào balô với tổng khối
    lượng không vượt quá j
    . L(n,W) sẽ là đáp số của bài toán (là giá trị lớn nhất có được nếu chọn
    n vật và tổng khối lượng không vượt quá W).
    Công thức tính L(i,t) như sau:
    • L(i,0)=0; L(0,j)=0.
    • L(i,j)=L(i,j) nếu t<a
    i.
    • L(i,t)=max(L(i-1,j), L(i,j–a
    i)+bi) nếu t ≥ai.
    Trong đó: L(i–1,j) là giá trị có được nếu không đưa vật i vào balô, L(i,j–a
    i)+bi là giá trị có
    được nếu chọn vật i.

    3. Cài đặt

    Ta có thể dùng một mảng 2 chiều để lưu bảng phương án, tuy nhiên dựa trên nhận xét rằng để
    tính dòng i của bảng phương án chỉ cần dòng i–1, ta chỉ cần dùng 2 mảng một chiều P và L có
    chỉ số từ 0 đến m để lưu 2 dòng đó. Đoạn chương trình con tính bảng phương án như sau.
    L[t]: = 0; {với mọi t}
    for i: = 1 to n do begin
    P:=L;
    for t: = 0 to m do
    if t<a[i] then L[t]:=P[t]
    else L[t]: = max(P[t],P[t–a[i]]);
    end;
    Nếu để ý kĩ bạn sẽ thấy rằng đoạn trình trên chỉ viết giống công thức QHĐ chứ chưa tối ưu.
    Chẳng hạn đã có lệnh gán P:=L, sau đó lại có gán L[t]:=P[t] với các giá trị t<a[i] là không cần
    thiết. Bạn đọc có thể tự cải tiến để chương trình tối ưu hơn.
    Chi phí không gian của cách cài đặt trên là O(m) và chi phí thời gian là O(n.m).

    4. Một số bài toán khác

    a) Farmer (IOI 2004)

    Một người có N mảnh đất và M dải đất. Các mảnh đất có thể coi là một tứ giác và các dải đất
    thì coi như một đường thẳng. Dọc theo các dải đất ông ta trồng các cây bách, dải đất thứ i có
    a
    i cây bách. Ông ta cũng trồng các cây bách trên viền của các mảnh đất, mảnh đất thứ j có bj
    cây bách. Cả ở trên các mảnh đất và dải đất, xen giữa 2 cây bách ông ta trồng một cây ôliu.
    Ông ta cho con trai được chọn các mảnh đất và dải đất tuỳ ý với điều kiện tổng số cây bách
    không vượt quá Q. Người con trai phải chọn thế nào để có nhiều cây ôliu (loài cây mà anh ta
    thích) nhất.
    Hướng dẫn: Dễ thấy mảnh đất thứ i có ai cây ôliu và dải đất thứ j có bj–1 cây ôliu. Coi các
    mảnh đất và dải đất là các “đồ vật”, đồ vật thứ k có khối lượng w
    k và giá trị vk (nếu k là mảnh
    đất i thì w
    k=vk=ai, nếu k là dải đất j thì wk=bj, vk=bj–1). Ta cần chọn các “đồ vật”, sao cho
    tổng “khối lượng” của chúng không vượt Q và tổng “giá trị” là lớn nhất. Đây chính là bài toán
    xếp balô đã trình bày ở trên.

    b) Đổi tiền

    Ở đất nước Omega người ta chỉ tiêu tiền xu. Có N loại tiền xu, loại thứ i có mệnh giá là ai
    đồng. Một người khách du lịch đến Omega du lịch với số tiền M đồng. Ông ta muốn đổi số
    tiền đó ra tiền xu Omega để tiện tiêu dùng. Ông ta cũng muốn số đồng tiền đổi được là ít nhất
    (cho túi tiền đỡ nặng khi đi đây đi đó). Bạn hãy giúp ông ta tìm cách đổi tiền.
    Hướng dẫn: Bài toán này khá giống bài toán xếp balô (“khối lượng” là mệnh giá, “giá trị”
    1), chỉ có một số thay đổi nhỏ:
    số đồng xu mỗi loại được chọn tuỳ ý (trong bài toán xếp balô
    mỗi đồ vật chỉ được chọn 1 lần) và
    tổng giá trị yêu cầu là nhỏ nhất.
    Do đó ta cũng xây dựng hàm QHĐ một cách tương tự: Gọi L(i,t) là số đồng xu ít nhất nếu đổi
    t đồng ra i loại tiền xu (từ 1 đến i). Công thức tính L(i,t) như sau:
    • L(i,0)=0;
    • L(0,t)= ∞ với t>0.
    • L(i,t)=L(i–1,t) nếu t<a
    i.
    • L(i,t)=min(L(i–1,t), L(i,t–a
    i)+1) nếu t ≥ai.
    Công thức này khác công thức của bài xếp balô ở chỗ: dùng hàm min chứ không phải hàm
    max (vì cần tìm cách chọn ít hơn) và nếu chọn đồng xu thứ i thì L(i,t)=L(i,t–ai)+1 (vì ta vẫn
    còn được chọn đồng xu thứ i đó nữa), khác với khi xếp balô là: nếu chọn đồ vật thứ i thì
    L(
    i,t)=L(i–1,t–ai)+bi vì đồ vật i chỉ được chọn một lần.

    V. Nhân ma trận

    1. Mô hình

    Nhân một ma trận kích thước m×n với một ma trận n×p, số phép nhân phải thực hiện là m.n.p. Mặt khác phép nhân các ma trận có tính kết hợp, tức là: (A.B).C = A.(B.C)

    Do đó khi tính tích nhiều ma trận, ta có thể thực hiện theo các trình tự khác nhau, mỗi trình tự tính sẽ quyết định số phép nhân cần thực hiện.

    Cho N ma trận A1,A2…An, ma trận Ai có kích thước là di–1×di. Hãy xác định trình tự nhân ma trận A1.A2…An sao cho số phép nhân cần thực hiện là ít nhất.

    2. Công thức

    Gọi F(i,j) là số phép nhân để tính tích các ma trận từ Aiđến Aj (Ai.Ai+1….Aj).
    • F(i,i)=0.
    • F(i,i+1)=d
    i–1.di.di+1
    • F(i,j) = min(F(i,k)+F(k+1,j)+di–1.dk.dj với k=i+1,i+2,…j–1)
    Công thức hơi phức tạp nên tôi xin giải thích như sau:
    • F(i,i)=0 là hiển nhiên.
    • F(i,i+1) là số phép nhân khi nhân A
    i và Ai+1. Ai có kích thước di–1×di, Ai+1 có kích thước
    d
    i×di+1, do đó F(i,i+1)=di–1.di.di+1.
    • Với j>i+1 thì ta thấy có thể tính Ai.Ai+1….Aj bằng cách chọn một vị trí k nào đó để đặt
    ngoặc theo trình tự:
    A
    i.Ai+1….Aj = (Ai..Ak).(Ak+1..Aj)
    Ma trận kết quả của phép nhân (A
    i..Ak) có kích thước di–1×dk, ma trận kết quả của phép nhân
    (A
    k+1..Aj) có kích thước ddj. Với cách đặt đó ta sẽ mất F(i,k) phép nhân để có kết quả trong
    dấu ngoặc thứ nhất, mất thêm F(k+1,j) phép nhân để có kết quả trong dấu ngoặc thứ hai, và
    cuối cùng mất d
    i–1.dk.dj để nhân 2 ma trận kết quả đó. Từ đó tổng số phép nhân của cách đặt
    đó là: F(i,k)+F(k+1,j)+d
    i–1.dk.dj.
    Ta chọn vị trí k cho số phép nhân ít nhất.

    3. Cài đặt

    Bảng phương án là một mảng 2 chiều F để lưu F(i,j). Chú ý khi cài đặt là để tính được F(i,j),
    ta phải tính F(i,k) và F(k+1,j) trước. Phương pháp đơn giản để làm điều đó là phương pháp đệ
    quy có nhớ.
    Tuy nhiên dựa vào nhận xét là trong công thức QHĐ: j–i lớn hơn k–i và j–k, ta có thể tính
    theo trình tự khác: tính các phần tử F(i,j) với j–i từ nhỏ đến lớn (không phải là tính các giá
    trị F(i,j) với i,j từ nhỏ đến lớn như vẫn làm). Với cách đó, khi tính đến F(i,j) thì ta đã có F(i,k)
    và F(k+1,j).
    Đoạn chương trình tính bảng phương án như sau:
    for i:=1 to n do F[i,i]:=0;
    for i:=1 to n–1 do
    F[i,i+1]: = d[i–1]*d[i]*d[i+1];
    for m:=2 to n–1 do begin
    for i:=1 to n–m do begin
    j:=i+m; F[i,j]:=oo;
    for k:=i+1 to j–1 do
    F[i,j]:=min(F[i,j],
    F[i,k]+F[k+1,j]+d[i–1]*d[k]*d[j]);
    end;
    end;
    Với cách cài đặt trên,chi phí không gian là O(n2), chi phí thời gian là O(n3) (đây là bài toán có
    chi phí lớn nhất trong tất cả các bài toán QHĐ thường gặp).

    4. Một số bài toán khác

    a) Chia đa giác

    Cho một đa giác lồi N đỉnh. Bằng các đường chéo không cắt nhau, ta có thể chia đa giác thành
    N–2 tam giác. Hãy xác định cách chia có tổng các đường chéo ngắn nhất.
    Hướng dẫn: Để đơn giản ta coi mọi đoạn thẳng nối 2 đỉnh đều là “đường chéo” (nếu nối 2
    đỉnh trùng nhau hoặc 2 đỉnh liên tiếp thì có độ dài bằng 0).
    Gọi F(i,j) là tổng độ dài các đường chéo khi chia đa giác gồm các đỉnh từ i đến j thành các
    tam giác. Nếu j<i+3 thì đa giác đó có ít hơn 4 đỉnh, không cần phải chia nên F(i,j)=0. Ngược
    lại ta xét cách chia đa giác đó bằng cách chọn một đỉnh k nằm giữa i,j và nối i,j với k. Khi đó
    F(i,j)=F(i,k)+F(k,j)+d(i,k)+d(k,j);
    d(i,k) là độ dài đường chéo (i,k).
    Tóm lại công thức QHĐ như sau:
    • F(i,j)=0 với j<i+3.
    • F(i,j)=min(F(i,k)+F(k,j)+d(i,k)+d(k,j) với k=i+1,…j–1).
    F(1,n) là tổng đường chéo của cách chia tối ưu.
    b) Biểu thức số học (IOI 1999)
    Cho biểu thức a1•a2•…•an, trong đó ai là các số thực không âm và • là một phép toán + hoặc
    × cho trước. Hãy đặt các dấu ngoặc để biểu thức thu được có kết quả lớn nhất.
    Hướng dẫn: Gọi F(i,j) là giá trị lớn nhất có thể có của biểu thức ai•ai+1•…•aj. Dễ thấy nếu i=j
    thì F(i,j)=a
    i, nếu j=i+1 thì F(i,j)=ai•aj. Nếu j>i+1 thì có thể tính biểu thức ai•ai+1•…•aj bằng
    cách chia thành 2 nhóm: (a
    i•ai+1•…•ak)•(ak+1•…•aj), Khi đó F(i,j)=F(i,k)•F(k+1,j).
    Tóm lại, công thức QHĐ là:
    Trang11

    • F(i,i)=ai
    • F(i,i+1)=ai•ai+1
    • F(i,j)=max(F(i,k)•F(k+1,j) với k=i+1,i+2,..j–1).
    (Chú là là các hạng tử của dãy đều không âm và các phép toán là + hoặc × nên F(i,k) và
    F(k+1,j) đạt max thì F(i,k)•F(k+1,j) cũng đạt max).

    VI. Ghép cặp

    1.Mô hình

    Có n lọ hoa sắp thẳng hàng và k bó hoa được đánh số thứ tự từ nhỏ đến lớn. Cần cằm k bó hoa trên
    vào n lọ sao cho hoa có số thứ tự nhỏ phải đứng trước hoa có số thứ tự lớn. Giá trị thẩm mỹ tương ứng
    khi cắm hoa i vào lọ thứ j là v(i,j) Hãy tìm 1 cách cắm sao cho tổng giá trị thẫm mỹ là lớn nhất. Chú ý
    rằng mỗi bó hoa chỉ được cắm vào 1 lọ và mỗi lọ cũng chỉ cắm được 1 bó hoa. (IOI –1999)

    2. Công thức

    Nhận xét rằng bài toán nêu trên là một bài toán ghép cặp có yêu cầu về thứ tự nên ta có thể
    giải quyết bằng phương pháp QHĐ.
    Hàm mục tiêu: f: tổng giá trị thẩm mỹ của cách cắm.
    Giá trị thẩm mỹ phụ thuộc vào các hoa và các lọ đang được xét nên ta sẽ dùng mảng 2 chiều
    để lưu bảng phương án.
    L(i,j): tổng giá trị thẩm mỹ lớn nhất khi xét đến hoa i và lọ j. Khi tính L(i,j) hoa đang xét sẽ là
    hoa i và lọ j.
    Nếu i = j. Chỉ có một cách cắm L(i,i):= v[1,1]+v[2,2]+…v[i,i]
    Nếu i>j. Không có cách cắm hợp lý
    Nếu i<j: Có 2 trường hợp xảy ra:
    Cắm hoa i vào lọ j. Tổng giá trị thẩm mỹ là L(i-1,j-1)+v(i,j). (Bằng tổng giá trị trước khi
    cắm cộng với giá trị thẩm mỹ khi cắm hoa i vào lọ j)
    Không cắm hoa i vào lọ j (có thể cắm vào lọ trước j), giá trị thẫm mỹ của cách cắm là như
    cũ: L(i,j-1)

    3. Cài đặt

    L[i,j]:= -maxint;
    For i:=1 to k do
    For j:=i to n do
    If i = j then L[i,j]:=sum(i)
    else
    if i<j then L[i,j]:=max(L[i-1,j-1]+v[i,j],L[i,j-1]);

    4. Một số bài toán khác

    a) Câu lạc bộ:( Đề thi chọn HSG Tin Hà Nội năm 2000)

    Có n phòng học chuyên đề và k nhóm học được đánh số thứ tự từ nhỏ đến lớn. Cần xếp k nhóm trên vào n phòng học sao cho nhóm có số hiệu nhỏ được xếp vào phòng có số hiệu nhỏ, nhóm có số hiệu lớn phải được xếp vào phòng có số hiệu lớn.Với mỗi phòng có chứ học sinh,
    các ghế thừa phải được chuyển ra hết, nếu thiếu ghế thì lấy vào cho đủ ghế. Biết phòng i có 

    a(i) ghế, nhóm j có b(j) học sinh. Hãy chọn 1 phương án bố trí sao cho tổng số lần chuyển ghế
    ra và vào là ít nhất.
    Hướng dẫn : Khi xếp nhóm i vào phòng j thì số lần chuyển ghế chính là độ chênh lệch giữa
    số ghế trong phòng i và số học sinh trong nhóm. Đặt v[i,j]:=|a(i)-b(j)|
    b) Mua giày (Đề QG bảng B năm 2003)
    Trong hiệu có n đôi giày, đôi giày i có kích thước hi. Có k người cần mua giày, người i cần
    mua đôi giày kích thước s
    i . Khi người i chọn mua đôi giày j thì độ lệch sẽ là |h(i)-s(j)|. Hãy
    tìm cách chọn mua giày cho k người trên sao cho tổng độ lệch là ít nhất. Biết rằng mỗi người
    chỉ mua 1 đôi giày và 1 đôi giày cũng chỉ có một người mua.
    Hướng dẫn : Lập công thức giải như bài Câu lạc bộ. Chú ý chứng minh tính đúng đắn của bổ
    đề heuristic sau: Cho 2 dãy tăng dần các số dương a
    1a2…an , b1b2…bn. Gọi c1c2…cn là một
    hoán vị của dãy {b
    n}. Khi đó: |a(1)-b(1)|+ |a(2)-b(2)|+…+ |a(n)-b(n)|< |a(1)-c(1)|+ |a(2)-
    c(2)|+…+ |a(n)-c(n)|

    VII. Di chuyển

    1. Mô hình

    Cho bảng A gồm MxN ô. Từ ô (i,j) có thể di chuyển sang 3 ô (i+1,j), (i+1,j–1) và (i+1,j+1). Hãy xác định một lộ trình đi từ hàng 1 đến hàng M sao cho tổng các ô đi qua là lớn nhất.

    2. Công thức

    Gọi F(i,j) là giá trị lớn nhất có được khi di chuyển đến ô (i,j). Có 3 ô có thể đi đến ô (i,j) là (i–1,j), (i–1,j–1) và (i–1,j+1). Do đó ta có công thức QHĐ như sau:

    • F(1,j)=A[1,j]
    • F(i,j)=max(F(i–1,j),F(i–1,j–1),F(i–1,j+1))+A[i,j] với i>1

    3. Cài đặt

    Bảng phương án là bảng 2 chiều F[0..m,0..n]. (Tất cả các ô trên biên đều cho giá trị bằng 0).

    Quá trình tính như sau:

    for i:=1 to m do
    for j: = 1 to n do
    F[i,j]=max[F[i–1,j],F[i–1,j–1],F[i–1,j+1]]+A[i,j];

    Cách cài đặt này cho chi phí không gian và thời gian đều là O(n2). Ta có thể tiết kiệm không gian nhớ bằng cách tính trực tiếp trên mảng A.

    4. Một số bài toán khác

    a) Tam giác (IOI 1994)

    Cho một tam giác gồm các số nguyên không âm. Hãy tính tổng lớn nhất các số trên đường đi từ đỉnh tam giác xuống một điểm nào đó ở đáy tam giác nào đó. Tại mỗi ô ta chỉ có đi thẳng xuống, sang ô bên trái hoặc bên phải.

    Hướng dẫn: Mô tả các phần tử của tam giác số như một ma trận, A[i,j] là phần tử thứ j trên dòng i (với 1≤i≤N và 1≤j≤i). Có 2 ô có thể di chưyển đến ô (i,j) là ô (i–1,j–1) và ô (i–1,j). Gọi F(i,j) là tổng lớn nhất có thể có khi đi đến ô (i,j) ta có:

    • F(1,1)=A[1,1]
    • F(i,1)=F(i–1,1)+A[i,1]
    • F(i,j)=max(F(i–1,j–1),F(i–1,j))+A[i,j]

    b) Con kiến

    Có một ống hình trụ, khi trải phẳng ra có thể là một bảng MxN ô. Giá trị A[i,j] là lượng thức ăn có ở ô ở dòng i cột j. Một con kiến xuất phát từ một ô ở mép bên trái của hình trụ và bò sang mép bên phải. Từ ô (i,j) kiến có thể bò sang 1 trong 3 ô (i–1,j+1), (i,j+1) hoặc (i+1,j+1). (Chú ý: vì ống hình trụ nên kiến đang ở dòng 1 có thể bò xuống dòng M và ngược lại). Bò qua ô nào thì kiến mang theo toàn bộ lượng thức ăn ở ô đó. Hãy tìm đường đi mà kiến kiếm được nhiều thức ăn nhất.

    Hướng dẫn: Để xử lí tình huống hình trụ, ta lưu dòng 0 là dòng M và dòng M+1 là dòng 1. Khi đó tương tự như bài toán ban đầu, gọi F(i,j) là lượng thức ăn kiến có được khi bò đến ô (i,j), ta thiết lập được công thức QHĐ sau:

    • F(i,1)=A[i,1]
    • F(i,j)=max(F(i–1,j–1),F(i,j–1),F(i+1,j+1))+A[i,j] với j>1
  • 12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING

    12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING

    12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING

    Update: Chúng tôi mới tìm được phần mềm soạn bài giảng điện tử miễn phí là LUMI, rất dễ sử dụng và nhiều tính năng hay. Mời thầy cô tham khảo trong bài viết Hướng dẫn sử dụng phần mềm Lumi và video sau:

    Ngày nay, với sự phát triển của CNTT, việc học tập và giảng dạy có nhiều thay đổi để phù hợp với yêu cầu của xã hội. Ngoài các phần mềm hội thảo, học online như Zoom Meeting, Google Meet, MS Team, Jitsi… thì còn có rất nhiều phần mềm phục vụ những công việc đặc thù như tạo bài giảng, tạo khóa học, biên tập bài giảng, xuất bản bài giảng…. Trong bài viết này, O2 Education xin giới thiệu các công cụ để Thầy Cô có thể tạo cho mình một bài giảng, một khóa học hoàn chỉnh.

    Hệ thống Elearning là gì?

    E-Learning là một hình thức giáo dục, học tập dựa trên sự kết nối của Internet, Intranet, Extranet và các thiết bị công nghệ (laptop, máy tính bảng, điện thoại thông minh, video tape, DVD, TV…). Thông qua hệ thống E – learning, người học có thể tiếp thu bài giảng như phương pháp học truyền thống, trao đổi tài liệu, tương tác lẫn nhau, đồng thời có thể trao đổi với giảng viên mà không cần phải gặp trực tiếp. Riêng đối với giảng viên, họ có thể trực tiếp giảng dạy cho học viên, lưu trữ, chia sẻ những bài giảng, dữ liệu bằng các hình ảnh, video, âm thanh, tổ chức kỳ thi trực tuyến và chấm điểm, tạo chủ đề thảo luận trong forum…

    Một hệ thống E-learning bao gồm những thành phần chính dưới đây:

    • Hệ thống quản lý học tập (LMS – Learning Management System): Là một hệ thống học tập trực tuyến hỗ trợ xây dựng các lớp học trực tuyến, quản lý lớp học, điểm danh, quản lý quá trình học tập và chuyên cần của học viên. Học viên sẽ tham gia lớp học trực tuyến, nhận tài liệu, bài giảng qua công cụ này.
    • Hệ thống quản lý nội dung học tập (LCMS – Learning Content Management System): là hệ thống quản lý nội dung, là một kho lưu trữ tập trung cho quản trị viên. Hệ thống này cho phép tạo ra và điều chỉnh, bổ sung, xem xét và quản lý các nội dung học tập khoa học và hiệu quả.
    • Công cụ soạn thảo bài giảng (Authoring tools): Đây là các hệ thống/công cụ/phần mềm hỗ trợ đầy đủ multimedia, giúp giảng viên soạn thảo giáo án điện tử, trình chiếu bài giảng, truyền tải nội dung kiến thức thông qua nhiều hình thức khác nhau như hình ảnh, video, âm thanh, chữ viết. Từ đó, tiết học sẽ diễn ra một cách sinh động, dễ theo dõi, dễ hiểu, dễ đạt hiệu quả cao. Đây cũng chính là công cụ mà chúng ta sẽ nói đến nhiều hơn ở phần dưới đây. Mỗi phần mềm tạo elearning đi kèm với nhiều tiêu chuẩn elearning được hỗ trợ riêng, bao gồm SCORM (1.2, 2004), xAPI / TinCan, HTML5, AICC, cmi5 và LTI. Để biết thêm thông tin về SCORM là gì, các phiên bản SCORM và cách nó so sánh với các tiêu chuẩn khác.

    12 công cụ phần mềm tạo bài giảng e-learning tốt nhất

    công cụ, phần mềm tạo bài giảng e-learning

    Trong bài đánh giá này, chúng tôi sẽ đi sâu hơn vào 12 phần mềm học trực tuyến tốt nhất. Ngoài ra, bạn có thể tham khảo thêm một phần mềm Avina Authoring Tools của Việt Nam.

    1. Elucidat – Giúp các nhà tuyển dụng lớn giảm chi phí đào tạo quan trọng đối với doanh nghiệp
    2. Adobe Captivate – Cung cấp cho các tác giả có kinh nghiệm sức mạnh để tạo nội dung chất lượng cao
    3. Articulate Storyline 360 – Lý tưởng cho người dùng cá nhân thích PowerPoint, với một lớp tùy chỉnh bổ sung
    4. Articulate Rise 360 – Người dùng có quyền truy cập vào Articulate 360 ​​có thể tạo các khóa học nâng cao đơn giản khá nhanh chóng
    5. Gomo– Tốt nhất cho các nhà thiết kế học hỏi kinh nghiệm không tìm kiếm các tùy chỉnh nâng cao
    6. Lectora– Cung cấp cho các tác giả truyền thống, có năng lực một công cụ hiệu quả để sản xuất nội dung HTML5
    7. Adapt – Được thiết kế cho các tác giả kỹ thuật đang tìm cách thiết kế tác giả HTML5 riêng biệt thông qua thiết kế back-end
    8. DominKnow– Hoàn hảo cho các nhóm tập trung vào chụp màn hình đáp ứng và mô phỏng phần mềm
    9. Easygenerator–  Phần mềm tác giả được thiết kế cho các nhóm nhỏ, những người cần sản xuất nội dung đơn giản, nhanh chóng
    10. iSpring Suite– Công cụ dựa trên PowerPoint trên máy tính để bàn là một lựa chọn tuyệt vời cho các nhà thiết kế mới học không phải lo lắng về việc cập nhật nội dung thường xuyên
    11. Evolve – Được xây dựng cho các nhóm cần cộng tác cùng nhau và không ngại dành thời gian để tìm hiểu cách sử dụng nó
    12. Camtasia – Bộ chỉnh sửa video được sử dụng phổ biến nhất để quay màn hình, hướng dẫn hoặc demo sản phẩm.

    Trong trường hợp bạn thiếu thời gian để xem xét chi tiết tất cả 12 công cụ tạo tác giả elearning tốt nhất trong blog này, đây là bảng so sánh hữu ích.

    Phần mềm Elearning Loại giải pháp Chất lượng đầu ra Tốc độ và hiệu quả Khả năng mở rộng
    1. Elucidat Nền tảng tác giả Elearning Cao Nhanh Cao
    2. Adobe Captivate Công cụ soạn thảo độc lập Cao Chậm Thấp
    3. Articulate Storyline 360 Bộ công cụ tạo bài giảng Trung bình Chậm Thấp
    4. Articulate Rise Công cụ tạo bài giảng trực tuyến Thấp Nhanh Trung bình
    5. Gomo Công cụ tạo bài giảng trực tuyến Trung bình Nhanh Cao
    6. Lectora Công cụ soạn thảo độc lập Trung bình Chậm Trung bình
    7. Adapt Công cụ tạo bài giảng trực tuyến Thấp Nhanh Trung bình
    8. DominKnow Công cụ tạo bài giảng trực tuyến Cao Trung bình Trung bình
    9. Easygenerator Công cụ tạo bài giảng trực tuyến Thấp Nhanh Thấp
    10. iSpring Suite Bộ công cụ tạo bài giảng Trung bình Trung bình Trung bình
    11. Evolve Công cụ tạo bài giảng trực tuyến Trung bình Nhanh Trung bình
    12. Camtasia Phần mềm tạo video Trung bình Trung bình Thấp

    1. Elucidat

    Elucidat giúp các nhóm đầy tham vọng tạo ra học liệu kỹ thuật số trên quy mô lớn dễ dàng hơn. Là một nền tảng soạn thảo bài giảng elearning hoàn toàn dựa trên đám mây, các doanh nghiệp có thể đáp ứng sự thay đổi nhanh hơn – và thông minh hơn!

    Trang chủ https://www.elucidat.com/

    phần mềm tạo bài giảng elearning Elucidat

    Chất lượng đầu ra Elearning

    • Elucidat đi kèm với một thư viện rộng lớn gồm các mẫu được tạo sẵn giúp ngay cả những tác giả mới làm quen cũng tạo ra những trải nghiệm tương tác tuyệt vời. Đối với những người muốn đổi mới, tính năng “trình thiết kế bố cục” cho phép bạn tạo thiết kế trang của riêng mình mà không cần viết mã.
    • Các quy tắc linh hoạt và các tùy chọn phân nhánh cho phép tác giả xây dựng các lộ trình học tập được cá nhân hóa để mang lại trải nghiệm học tập tuyệt vời. Thăm dò ý kiến ​​xã hội, trò chơi hóa và một loạt các loại tương tác mang lại cho bạn nhiều cơ hội để thu hút người học.
    • Bảng điều khiển phân tích của Elucidat cung cấp cho các tác giả dữ liệu chi tiết về cách người học tương tác với khóa học của họ, cho phép bạn liên tục tối ưu hóa cho sự tương tác.

    Tốc độ và hiệu quả

    Bộ tính năng của Elucidat giúp tạo ra quá trình học tập chất lượng cao nhanh hơn và hiệu quả hơn.

    Với Trình tăng tốc học tập của Elucidat, bạn có thể đào tạo nhanh hơn gấp 4 lần. Nền tảng sẽ đề xuất các mẫu nâng cấp dựa trên mục tiêu dự án của bạn. Bạn chỉ cần thêm nội dung (với các mẹo thực hành tốt nhất trong quá trình thực hiện). Đơn giản như vậy.

    Các tính năng hiệu quả khác sẽ tăng tốc quá trình sản xuất của bạn bao gồm:

    • Một thư viện mẫu
    • Một bộ tương tác
    • Nhà nhập khẩu thương hiệu
    • Giao diện WYSIWYG (những gì bạn thấy là những gì bạn nhận được)
    • Khả năng áp dụng các phong cách hiện có cho các dự án mới

    Khả năng mở rộng

    Elucidat được sinh ra để giúp các nhóm mở rộng quy mô sản xuất Elearning. Với vai trò và quyền người dùng có thể tùy chỉnh, bạn có thể mời tất cả các bên liên quan của mình cộng tác trong nền tảng – từ các nhà thiết kế học tập của bạn đến các chuyên gia về chủ đề.

    Thư viện tài sản trung tâm cho phép đồng nghiệp chia sẻ tài sản giữa các phòng ban. Bạn muốn thay thế hình ảnh, biểu trưng hoặc video? Cập nhật qua nhiều khóa học với một cú nhấp chuột.

    Trình quản lý các biến thể tập trung các khóa học với nhiều phiên bản thành một ‘khóa học tổng thể’ đơn giản. Các khóa học dành cho trẻ em sau đó ngồi bên dưới nó. Mối quan hệ cha-con có nghĩa là tất cả các phiên bản đều có thể chỉnh sửa được ở cấp độ chính – tiết kiệm rất nhiều thời gian để chỉnh sửa một số biến thể của cùng một khóa học!

    Bản dịch cũng dễ dàng! Sử dụng tính năng nhập / xuất đơn giản, tải lên ngôn ngữ mới và xem khóa học điều chỉnh kích thước của nó. Sau đó, thực hiện các chỉnh sửa riêng biệt cho từng khóa học đã dịch riêng lẻ bằng trình quản lý các biến thể.

    Các định dạng elearning được hỗ trợ

    Nền tảng tác giả của Elucidat hoàn toàn dựa trên đám mây, tạo ra nội dung nâng cao chất lượng cao, tuân thủ SCORM HTML5. Hỗ trợ hầu hết các định dạng elearning, cũng như báo cáo dữ liệu xAPI nâng cao và nội dung đáp ứng trên thiết bị di động, Elucidat được coi là một trong những công cụ tạo Elearning SCORM hàng đầu cho cả Mac và Windows.

    Elucidat hỗ trợ các định dạng nâng cao sau:

    • HTML5, Video, SCORM (1.2, 2004), xAPI (TinCan)
    • Windows, Mac OS

    Điểm mạnh của Elucidat

    • Các mẫu tạo sẵn sẽ giúp quá trình sản xuất của bạn nhanh hơn gấp 4 lần
    • Nhiều tương tác và tính năng, bao gồm các quy tắc, chi nhánh và huy hiệu
    • Các trang độc đáo, cộng với sự linh hoạt trong việc tạo trang của riêng bạn
    • Giao diện WYSIWYG dễ sử dụng
    • Quản lý thương hiệu nâng cao để đáp ứng các nguyên tắc
    • Quyền linh hoạt và vai trò người dùng
    • Quản lý các biến thể để đơn giản hóa làm việc trên quy mô lớn
    • Quy trình dịch thuật phức tạp
    • Nhóm hỗ trợ xuất sắc, được bao gồm trong gói của bạn

    Điểm yếu của Elucidat

    • Cần đầu tư thời gian để sử dụng toàn bộ khả năng của công cụ
    • Có vẻ tốn kém nếu bạn không sản xuất nhiều nội dung, vì nền tảng được thiết kế cho các nhóm tạo và quản lý elearning trên quy mô lớn. Thông tin thêm về ROI của Elucidat tại đây .

    Tốt nhất cho:

    • Tác giả của mọi khả năng
    • Các nhà tuyển dụng doanh nghiệp lớn muốn có được tác động kinh doanh nhanh hơn
    • Các nhóm cần sản xuất Elearning chất lượng cao, nhanh chóng
    • Làm việc nhóm trên quy mô toàn cầu
    • Hướng dẫn toàn diện và hỗ trợ người dùng
    • Học tập lấy con người làm trung tâm

    2. Adobe Captivate

    Captivate là một ứng dụng dành cho máy tính để bàn có sẵn cho cả Windows và Mac. Đây là một trong những công cụ tạo tác giả nâng cao mạnh mẽ nhất trong danh sách này, nhưng đi kèm với đường cong học tập dốc hơn và hàng loạt thách thức của riêng nó.

    Trang chủ https://www.adobe.com/uk/products/captivate.html
    12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING 2

    Chất lượng đầu ra Elearning

    Các tác giả có kinh nghiệm có thể tạo nội dung học tập bằng cách sử dụng các tùy chọn tùy chỉnh từ các chủ đề (tương đối hạn chế) có sẵn. Các chủ đề tương tự như PowerPoint, với bảng màu và trang trình bày chính xác định giao diện.

    Tốc độ và hiệu quả của việc soạn thảo

    Đường cong học tập dốc của Captivate có nghĩa là cần có thời gian đào tạo và nâng cao đáng kể cho các tác giả mới. Nội dung đơn giản được sản xuất tương đối nhanh, nhưng nếu bạn đang sử dụng các tương tác nâng cao hơn, hãy chuẩn bị sẵn sàng trong vài giờ.

    Khả năng mở rộng

    Bởi vì Captivate là một ứng dụng tạo tác vụ cho máy tính để bàn, nó không được thiết lập để làm việc cộng tác và nhất quán trên quy mô lớn. Các chủ đề và trang trình bày chính có thể được chia sẻ để cài đặt trên các máy tính khác, nhưng quá trình này là thủ công và có thể phức tạp. Điều tương tự cũng áp dụng cho việc quản lý tài sản; mỗi người dùng máy tính để bàn đều “tự lập” khi tạo nội dung và nội dung.

    Các định dạng elearning được hỗ trợ

    Captivate là một phần mềm nâng cao SCORM mạnh mẽ. Trước đây là một công cụ dựa trên máy tính để bàn dành cho windows, bản cập nhật năm 2019 có hai bản cập nhật lớn: một số khía cạnh của công cụ đã được đưa lên mạng và người dùng Mac cuối cùng cũng có thể truy cập phần mềm.

    Phần mềm học tập Captivate hỗ trợ nhiều định dạng:

    • HTML5, SCORM, AICC, xAPI (TinCan)
    • Windows, Mac OS

    Khai thác điểm mạnh

    • Có khả năng tạo ra các tương tác phức tạp (nếu bạn biết cách)
    • Đầu ra có thể nhận biết vị trí (tức là, bạn có thể kết nối với khả năng xác định vị trí địa lý của thiết bị)
    • Tính tương tác trong đầu ra có thể nhận ra các cử chỉ phổ biến trên thiết bị di động (ví dụ: chụm và thu phóng, vuốt)
    • Các loại tương tác dựa trên gia tốc kế
    • Tốt cho quay màn hình và mô phỏng
    • Khả năng tạo trải nghiệm học tập thực tế ảo (VR)

    Nắm bắt điểm yếu

    • Đường cong học tập sâu sắc với sự hỗ trợ hạn chế
    • Hạn chế của công cụ dành cho máy tính để bàn – thử thách cộng tác, đánh giá và kiểm soát phiên bản
    • Thiết kế theo phong cách tuyến tính truyền thống so với các công cụ tạo tác giả nâng cao hiện đại hơn
    • Quá trình khó khăn để cập nhật và duy trì nội dung hiện có

    Tốt nhất cho:

    • Tác giả có kinh nghiệm
    • Sản xuất điện tử bản địa hóa
    • Trải nghiệm học tập tương tác
    • Nội dung nâng cấp sẵn sàng cho thiết bị di động
    • Tùy chọn xuất bản dễ dàng

    3. Articulate Storyline 360

    Articulate Storyline là một ứng dụng tạo tác giả trên máy tính để bàn Windows sử dụng giao diện PowerPoint. Nó có một đường cong học tập khiêm tốn xem xét tính linh hoạt mà nó cung cấp — đặc biệt nếu bạn đã biết cách sử dụng PowerPoint.

    Trang chủ https://articulate.com/360/storyline
    12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING 3

    Chất lượng đầu ra Elearning

    Nếu bạn có các kỹ năng và năng lực, Storyline cho phép bạn tạo nội dung hấp dẫn và được tùy chỉnh cao. Giống như Powerpoint, bạn có thể điều khiển các trang chủ đề thông qua màu sắc của dự án và trang chiếu cái. Điều này làm cho nó rất linh hoạt, nhưng hơi khó để kiểm soát thương hiệu nhất quán qua nhiều khóa học và cài đặt Cốt truyện.

    Tốc độ và hiệu quả của việc soạn thảo

    Articulate Storyline là một công cụ phức tạp, vì vậy nếu các tổ chức không đầu tư thời gian vào việc đào tạo, thì hiệu quả của tác giả có thể bị hạn chế. Tuy nhiên, là một trong những công cụ tạo tác giả elearning được sử dụng rộng rãi nhất, nhiều nhà thiết kế đã có kinh nghiệm với Storyline.

    Khả năng mở rộng

    Là một công cụ dựa trên máy tính để bàn, sự cộng tác và do đó khả năng mở rộng bị hạn chế. Thật khó để chia sẻ các khóa học với những người khác để sử dụng lại và nội dung không được lưu trữ tập trung.

    Có một tính năng xuất kéo tất cả văn bản ra khỏi một khóa học để hỗ trợ dịch, nhưng cần phải điều chỉnh thủ công để đảm bảo (các) ngôn ngữ mới vẫn phù hợp trên trang, v.v.

    Các định dạng elearning được hỗ trợ

    Articulate là một trong những công cụ tạo tác giả nâng cấp dựa trên windows lâu đời nhất và được sử dụng rộng rãi nhất. Công cụ tác giả tuân thủ SCORM chính của Articulate, Articulate Storyline, là một ứng dụng dựa trên cửa sổ mạnh mẽ hỗ trợ hầu hết các định dạng nâng cao:

    • AICC, SCORM, xAPI (TinCan)
    • các cửa sổ

    Điểm mạnh của Articulate Storyline 360

    • Tính linh hoạt và kiểm soát tốt về đầu ra nội dung
    • Một công cụ thường được sử dụng, vì vậy các nhà thiết kế có xu hướng có kinh nghiệm
    • Cộng đồng trực tuyến rất tích cực
    • Mạnh mẽ hợp lý cho tôi thấy / thử tôi / kiểm tra cho tôi khả năng nâng cao mô phỏng phần mềm

    Điểm yếu của Articulate Storyline 360

    • Không thực sự phản hồi trên thiết bị di động – nó chỉ thu nhỏ màn hình
    • Thiết kế tuyến tính truyền thống hơn so với các công cụ tạo tác giả nâng cao hiện đại
    • Việc cộng tác và cập nhật nội dung có thể tốn nhiều thời gian
    • Không nhận được các tính năng mới và sửa lỗi ngay lập tức
    • Có thể rất tốn kém nếu bạn có nhiều tác giả và muốn mở rộng nội dung
    • Chức năng đọc màn hình kém

    Tốt nhất cho:

    • Tác giả có kinh nghiệm
    • Sản xuất nội dung tùy chỉnh cao
    • Khả năng thiết kế mở rộng
    • Các mẫu và tính năng thiết kế linh hoạt

    4. Articulate Rise 360

    Articulate Rise là một công cụ tạo tác giả dựa trên web được bao gồm như một phần của bản cập nhật Articulate 360 ​​được phát hành vào khoảng cuối năm 2016. Có một loạt các loại bài học được xây dựng trước, cách học tùy chỉnh được gọi là “khối”, tương tác và các video truyền hình để tạo một loạt các khóa học.

    Trang chủ https://articulate.com/360/rise
    12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING 4

    Chất lượng đầu ra Elearning

    Rise thực sự dễ sử dụng với giao diện trực quan và cung cấp một loạt các tương tác chuẩn, được tạo sẵn, bao gồm các mốc thời gian, quy trình, đồ họa được gắn nhãn, v.v. Điều này giúp bạn dễ dàng tạo nội dung tương tác trông đẹp mắt.

    Tốc độ và hiệu quả của tác giả

    Nếu bạn đang tìm cách tạo nội dung nâng cao tương đối cơ bản, đẹp mắt thì bạn có thể thực hiện nhanh chóng trong Rise. Bạn không cần phải là một tác giả có kinh nghiệm và có thể thiết lập và chạy để tạo các khóa học bằng cách làm theo một trình tự các bước hợp lý – bắt đầu từ đầu bằng cách chọn một mẫu.

    Khả năng mở rộng

    Các khóa học Elearning có thể được nhân bản và sử dụng lại để tiết kiệm thời gian khi làm việc trên quy mô lớn. Bạn cũng có thể tạo một “mẫu khối”, sau đó có thể chèn vào bất kỳ đâu trong bất kỳ khóa học nào.

    Các định dạng elearning được hỗ trợ

    Rise, một phần mềm tác giả dựa trên trực tuyến, là một phần của nền tảng tác giả 360 của Ariculate. Cung cấp cho người dùng Mac tùy chọn sử dụng Articulate để tạo các khóa học tuân thủ SCORM đơn giản.

    Hỗ trợ:

    • AICC, SCORM, xAPI (TinCan)
    • Windows, Mac OS

    Điểm mạnh

    • Dễ sử dụng với giao diện đơn giản và trực quan
    • Nhanh chóng để tạo nội dung nâng cao đẹp mắt (tương đối đơn giản) một cách nhanh chóng
    • Dự báo màn hình có sẵn
    • Dựa trên đám mây – dễ dàng cập nhật, cộng tác và đánh giá

    Điểm yếu

    • Nội dung có thể trông rất chung chung
    • Khả năng tùy biến và tính linh hoạt hạn chế
    • Không quản lý bản dịch
    • Thiếu các tùy chọn trợ năng
    • Giới hạn lưu trữ tại chỗ

    Tốt nhất cho:

    • Tác giả có ít hoặc không có kinh nghiệm trước đây về phần mềm elearning
    • Các mẫu cơ bản ‘không kiểu cách’
    • Sản xuất nội dung nhanh chóng
    • Sự hợp tác giữa nhiều tác giả và / hoặc các bên liên quan

    5. Gomo

    Gomo là một công cụ tạo tác giả dựa trên đám mây cho phép bạn tạo nội dung theo phong cách web. Các khóa học của bạn có thể được tổ chức trực tuyến qua web hoặc ngoại tuyến bằng ứng dụng Gomo. Nó tránh được rất nhiều vấn đề đau đầu khi đi kèm với các công cụ dựa trên máy tính để bàn, nhưng có một số hạn chế về số lượng tùy chỉnh mà bạn có thể thực hiện.

    Trang chủ https://www.gomolearning.com/
    phần mềm tạo bài giảng gomo

    Chất lượng đầu ra Elearning

    Gomo đi kèm với một loạt các chủ đề mà bạn có thể tinh chỉnh để nhanh chóng tạo ra các chủ đề trông hiện đại và đúng thương hiệu. Cần lưu ý rằng các chủ đề được tùy chỉnh hoàn toàn yêu cầu sự phát triển của chuyên gia, điều này có thể tốn kém nếu bạn có kế hoạch lớn cho hình ảnh của mình.

    Có một loạt các mẫu tương tác có sẵn để làm cho nội dung nâng cao của bạn trở nên sống động. Tất cả các tương tác đều nằm trong cấu trúc hai cột, điều này sẽ hạn chế một chút thiết kế của bạn.

    Tốc độ và hiệu quả của việc soạn thảo

    Các mẫu được tạo sẵn và trình hướng dẫn bắt đầu nhanh làm mềm đường cong học tập với Gomo, vì vậy bạn có thể bắt đầu và chạy nhanh chóng. Tuy nhiên, giao diện tách biệt với khóa học đã hoàn thành, có nghĩa là bạn không thể thấy khóa học của mình sẽ như thế nào khi bạn tiếp tục.

    Khả năng mở rộng

    Là dựa trên đám mây, Gomo cho phép các tác giả cộng tác để tạo các khóa học. Ngoài ra còn có một tùy chọn multi-Scout cho phép các phiên bản đã dịch nằm trong một gói, với người học chọn ngôn ngữ họ muốn tham gia khóa học ngay từ đầu. Đây là một tính năng hữu ích nếu bạn đang phân phối nội dung trên toàn cầu.

    Các định dạng elearning được hỗ trợ

    Gomo là một công cụ tác giả dựa trên đám mây được thiết kế cho cả windows và mac. Nó tạo ra HTML5, nội dung ưu tiên cho thiết bị di động có thể được phát hành lên LMS của chính nó.

    Hỗ trợ:

    • HTML5, SCORM, xAPI (TinCan)
    • Windows, Mac OS

    Điểm mạnh của Gomo

    • Đó là một công cụ soạn thảo dựa trên đám mây, cung cấp tính linh hoạt cao hơn so với các công cụ dành cho máy tính để bàn
    • Bạn có thể tạo ra đầu ra nâng cao đáp ứng
    • Họ có một ứng dụng di động ngoại tuyến và Gomo Central, là một cổng thông tin học tập dựa trên đám mây
    • Khả năng cung cấp các khóa học đa ngôn ngữ

    Điểm yếu của Gomo

    • Các hạn chế về bố cục hạn chế khả năng sáng tạo của bạn và mang lại cho các khóa học một giao diện và cảm nhận kiểu mẫu
    • Giao diện không trực quan và khó sử dụng nếu không có giao diện WYSIWYG
    • Các tùy chọn tùy chỉnh có thể không đủ cho hình ảnh sáng tạo

    Tốt nhất cho:

    • Tác giả ở mọi cấp độ
    • Elearning đa ngôn ngữ
    • Các chủ đề cơ bản dễ chỉnh sửa
    • Cộng tác giữa nhiều tác giả

    6. Lectora Inspire and Lectora Online

    Tất nhiên, trong lĩnh vực tác giả của các công cụ, Lectora là một chính khách lớn tuổi. Phần mềm tạo tác giả trên máy tính để bàn Windows đã có từ lâu và hướng tới các tác giả có kinh nghiệm hơn.

    Trang chủ https://www.trivantis.com/products/inspire-e-learning-software/

    Gần đây, họ đã phát hành phiên bản HTML5 dựa trên đám mây của công cụ tác giả có tên là Lectora Online, mang lại tính linh hoạt cao. Nó có thể mạnh mẽ khi bạn biết cách sử dụng nó, nhưng giống như những công cụ khác của ilk này, nó đi kèm với đường cong học tập dốc hơn nhiều công cụ khác trong danh sách.

    12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING 5

    Lector có tính năng dịch để giúp bạn mở rộng một khóa học sang nhiều ngôn ngữ, nhưng không có mối quan hệ cha-con giữa các tệp. Điều này có nghĩa là bất kỳ thay đổi nào cần được thực hiện cho từng phiên bản riêng lẻ, đây là một vấn đề đau đầu nếu bạn đang xử lý nhiều phiên bản và ngôn ngữ.

    Chất lượng đầu ra Elearning

    Có rất nhiều mẫu tương tác được tạo sẵn có thể được sử dụng khi chúng xuất hiện hoặc được tinh chỉnh. Một số khía cạnh có thể được thay đổi thông qua giao diện phát triển, nhưng đối với những khía cạnh khác, bạn có thể cần sử dụng gói đồ họa để thay thế hình ảnh hiện có. Bạn có thể tạo nội dung elearning đẹp mắt với Lectora; tuy nhiên, bạn cần phải là một nhà thiết kế hướng dẫn tương đối có kinh nghiệm và tự tin với công cụ để làm như vậy.

    Tốc độ và hiệu quả của việc soạn thảo

    Đường cong học tập dốc có nghĩa là bạn không thể mong đợi đầu ra nhanh chóng đáng kinh ngạc, nhưng nếu bạn đầu tư thời gian, bạn có thể tạo nội dung kiểu web trông đẹp mắt.

    Khả năng mở rộng

    Lector có tính năng dịch để giúp bạn mở rộng một khóa học sang nhiều ngôn ngữ, nhưng không có mối quan hệ cha-con giữa các tệp. Điều này có nghĩa là bất kỳ thay đổi nào cần được thực hiện cho từng phiên bản riêng lẻ, đây là một vấn đề đau đầu nếu bạn đang xử lý nhiều phiên bản và ngôn ngữ.

    Các định dạng elearning được hỗ trợ

    Lectora là một công cụ tác giả trực tuyến dựa trên đám mây có thể được truy cập từ bất kỳ hệ điều hành nào. Công cụ có khả năng tùy biến cao với các phần tử lập trình tùy chọn (nếu bạn có kiến ​​thức để làm như vậy!)

    Hỗ trợ:

    • HTML5, xAPI (TinCan), SCORM, AICC
    • Hệ điều hành Windows, MAC

    Điểm mạnh của Lectora

    • Miễn phí truy cập thư viện đồ họa Elearning Brothers
    • Tốt cho chụp ảnh và mô phỏng màn hình
    • Có công cụ cộng tác người đánh giá trực tuyến bằng cách sử dụng ReviewLink
    • Có thể nhập Powerpoint (mặc dù đó là một ý tưởng hay!)
    • Tính năng kiểm tra lỗi gắn cờ các sự cố trước khi bạn phát hành

    Điểm yếu của Lectora

    • Đường cong học tập sâu sắc với sự hỗ trợ hạn chế
    • Giao diện không thân thiện với người dùng, trực quan hoặc dễ sử dụng
    • Theo đánh giá trực tuyến, hỗ trợ khách hàng của Lectora hơi chậm và không hữu ích lắm
    • Nhiều tính năng nâng cao không tuân thủ Mục 508

    Tốt nhất cho:

    • Các tác giả giàu kinh nghiệm với chuyên môn thiết kế
    • Đối chiếu phản hồi từ nhiều bên liên quan
    • Nội dung nâng cao thân thiện với thiết bị di động
    • Nội dung web trông chuyên nghiệp

    7. Adapt

    Adapt là một công cụ tác giả mã nguồn mở tạo ra nội dung HTML5 đáp ứng. Các nhà phát triển ở bất kỳ đâu đều có thể thêm các tương tác mới vào cộng đồng. Công cụ tác giả chỉ cung cấp các thành phần đã được thử và kiểm tra từ cộng đồng cho người dùng.

    Trang chủ https://www.adaptlearning.org/
    12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING 6

    Chất lượng đầu ra Elearning

    Bạn có thể tạo nội dung hiện đại, bắt mắt với các chủ đề trong Adapt hoặc bằng cách tạo các chủ đề của riêng bạn. Tuy nhiên, Adapt hoạt động trên một hệ thống dạng lưới với các khối nội dung, vì vậy các sản phẩm hoàn thiện đều trông “khối” và giống nhau.

    Có một loạt các tương tác và tính năng đánh giá, nhưng tất cả chúng đều khá “chuẩn” – không có gì thực sự sáng tạo hoặc khác biệt so với các công cụ khác.

    Tốc độ và hiệu quả của việc soạn thảo

    Giao diện công cụ tác giả khá đẹp và sử dụng tương đối đơn giản. Tuy nhiên, nó không phải là WSYWIG, vì vậy bước “xem trước” bổ sung cần được sử dụng nhiều hơn khi tạo.

    Khả năng mở rộng

    Có thể sao chép các khóa học; tuy nhiên, dường như không có bất kỳ tính năng dịch hoặc biến thể phức tạp nào, có thể hạn chế mức độ hiệu quả của bạn trong việc mở rộng quy mô.

    Các định dạng elearning được hỗ trợ

    Adapt là một phần mềm học tập phức tạp yêu cầu phát triển kỹ thuật chuyên sâu để phát triển các khóa học nâng cao tuân thủ. Nó cũng bao gồm nội dung HTML5 có thể tùy chỉnh.

    Hỗ trợ:

    • HTML5, SCORM
    • Windows, Mac OS

    Điểm mạnh

    • Nó miễn phí!
    • Nếu bạn là nhà phát triển hoặc có quyền truy cập vào nhà phát triển, bạn cũng có thể sử dụng khuôn khổ (miễn phí) thay vì công cụ và tạo các tương tác / bố cục tùy chỉnh, v.v.
    • Giao diện tác giả tương đối dễ hiểu
    • HTML5 đáp ứng

    Điểm yếu

    • Nhóm tương tác hạn chế so với những gì mà khung Thích ứng có thể
    • Bố cục “khối” dẫn đến nhiều nội dung trông chung chung
    • Nó không dựa trên đám mây và có thể mất một lúc để cài đặt

    Tốt nhất cho:

    • Một giải pháp hiệu quả về chi phí
    • Giới thiệu dễ dàng
    • Giao diện người dùng trực quan, đơn giản
    • Nội dung HTML5 có thể tùy chỉnh

    8. DominKnow ONE

    DominKnow ONE tập hợp công cụ tạo tác giả truyền thống của họ Claro với DominKnow Flow để tạo khả năng tác giả và chụp ảnh màn hình cũng như mô phỏng đáp ứng. Nó có giao diện Microsoft truyền thống và các tính năng mạnh mẽ. Giống như Lectora, nó không phải là công cụ soạn thảo trực quan nhất hiện có và các bài đánh giá nêu bật sự hỗ trợ và trợ giúp hạn chế được cung cấp.

    Trang chủ https://www.dominknow.com/dominknow-one-cloud-based-elearning-authoring
    12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING 7

    Chất lượng đầu ra Elearning

    Phần mềm tạo DominKnow cho phép bạn bắt đầu với một loạt các chủ đề và mẫu, có thể được tùy chỉnh. Bạn cũng có thể nhập nội dung Powerpoint của mình để sau đó chỉnh sửa trong công cụ.

    Khả năng thiết kế đáp ứng rất mạnh và có rất nhiều hành động để tạo ra các loại trang và tương tác khác nhau.

    Tốc độ và hiệu quả của việc soạn thảo

    Khi bạn đã hiểu rõ về giao diện tương đối phức tạp, công cụ này khá dễ sử dụng. Có rất nhiều mẫu để giúp bạn thiết lập và chạy một cách nhanh chóng. Có thể sử dụng lại các phần của một trang, sao chép sang một trang khác là một cách tiết kiệm thời gian tiện dụng. Khả năng cộng tác và xem xét trực tuyến giúp tăng tốc quá trình sản xuất so với các công cụ trên máy tính để bàn.

    Khả năng mở rộng

    Tác giả có thể sao chép một khóa học, cấu trúc, đối tượng học tập hoặc các trang để tạo ra một bản sao duy nhất của khóa học, giúp đẩy nhanh tiến độ và giúp có tính nhất quán. Công cụ soạn thảo khóa học DominKnow cũng có tính năng xuất và nhập bản dịch.

    Các định dạng elearning được hỗ trợ

    DominKnow là một công cụ soạn thảo elearning trực tuyến, tuân thủ SCORM, tạo ra nội dung HTML5 tuyệt vời – tốt nhất chính cho các hệ thống mô phỏng đào tạo.

    Hỗ trợ:

    • SCORM, xAPI, AICC, Web  
    • Windows, Mac OS

    Điểm mạnh của DominKnow

    • Cho phép cộng tác tác giả và đánh giá; họ cũng có vai trò người dùng (ví dụ: nhưng không rộng rãi như Elucidat)
    • Khả năng thiết kế đáp ứng mạnh mẽ
    • Họ có nhiều loại “Hành động” giúp bạn linh hoạt trong việc tạo các loại trang
    • Nhập Powerpoint
    • Một trong số ít công cụ cung cấp chuyến tham quan sản phẩm để giúp người dùng mới điều hướng công cụ

    Điểm yếu của DominKnow

    • Giao diện không đặc biệt trực quan nên việc bắt kịp tốc độ có thể khá chậm
    • Tài liệu Trợ giúp đôi khi gây hiểu lầm hoặc không đầy đủ
    • Không tuyệt vời ở Gamification
    • Cài đặt chủ đề có thể tùy chỉnh hơi hạn chế

    Tốt nhất cho:

    • Các chủ đề cơ bản có thể tùy chỉnh
    • Nhập Powerpoint
    • Dịch nội dung
    • Hỗ trợ người dùng và hướng dẫn sản phẩm

    9. Easygenerator

    Easygenerator là một nền tảng nâng cao dựa trên đám mây đã ra đời từ năm 2013. Đầu mối nằm ở tên… công cụ tác giả này tập trung vào việc tạo nội dung nâng cao tương đối đơn giản một cách nhanh chóng.

    Trang chủ https://www.easygenerator.com/
    12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING 8

    Chất lượng đầu ra Elearning

    Bạn có thể xây dựng khóa học của riêng mình từ đầu và tạo ra các thiết kế đáp ứng một cách dễ dàng với các tương tác và loại câu hỏi đơn giản. Ngoài ra, bạn có thể bắt đầu sử dụng một mẫu, giống như các khóa học ngoài giá sách có đầy đủ nội dung.

    Tốc độ và hiệu quả của việc soạn thảo

    Như bạn mong đợi, phần mềm tạo Easygenerator nhanh chóng nắm bắt được và chúng có các mẫu được tạo sẵn để giúp bạn bắt đầu. Quy trình làm việc hướng dẫn bạn qua một loạt các bước để tạo một phần của elearning, giúp bạn dễ dàng tập trung vào nhiệm vụ đang làm và tránh bỏ lỡ bất kỳ điều gì quan trọng.

    Khả năng mở rộng

    Có thể sử dụng lại và sao chép nội dung nâng cao để sử dụng lại, nhưng đây có thể là một quá trình hơi rắc rối.

    Các định dạng elearning được hỗ trợ

    Easygenerator là một công cụ soạn thảo tuân thủ SCORM rất đơn giản để tạo nội dung HTML5 cơ bản. Mong đợi nội dung nhanh chóng và dễ dàng, với đầu ra hạn chế!

    Hỗ trợ:

    • SCORM, xAPI (TinCan), LTI
    • Windows, Mac OS

    Điểm mạnh của Easygenerator

    • Tốt cho các tác giả mới bắt đầu xây dựng nội dung nâng cao – không cần viết mã!
    • Các tính năng thiết kế đáp ứng thân thiện với thiết bị di động
    • Khả năng nhập Powerpoint (nhưng chúng tôi khuyên bạn nên làm như vậy một cách thận trọng!)

    Điểm yếu của Easygenerator

    • Không phải mọi loại câu hỏi và tương tác có sẵn đều được tối ưu hóa hoàn toàn cho nhiều thiết bị
    • Các tính năng hạn chế – mặc dù nhóm cũng sẵn sàng lắng nghe các đề xuất và phát hành các bản cập nhật dựa trên nhu cầu của khách hàng
    • Hạn chế đối với các loại câu hỏi / câu đố đối với các gói định giá nhất định
    • Giới hạn từ cho nhiều câu hỏi dạng dài
    • Chỉ tương thích với SCORM 1.2

    Tốt nhất cho:

    • Tác giả có ít hoặc không có kinh nghiệm sử dụng phần mềm elearning
    • Tạo các khóa học bằng nhiều ngôn ngữ
    • Xây dựng các khóa học elearning một cách nhanh chóng
    • Thiết kế thân thiện với thiết bị di động

    10. iSpring Suite

    iSpring Suite là bộ công cụ soạn thảo dựa trên PowerPoint cho phép người dùng tạo các khóa học dựa trên trang trình bày, câu đố, mô phỏng hộp thoại, video truyền hình, bài giảng video và các tài liệu học tập tương tác khác. Các khóa học đầu ra được xuất bản bằng HTML5. Với một đường cong học tập thấp hợp lý (nếu bạn biết cách sử dụng PowerPoint!), Người dùng có thể bắt đầu chạy, nhưng có thể bị hạn chế khi họ tiến bộ nhiều hơn.

    Trang chủ https://www.ispringsolutions.com/ispring-suite

    12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING 9

    Chất lượng đầu ra Elearning

    Rất có thể bạn đã tạo một bài thuyết trình Powerpoint trước đó, vì vậy chất lượng đầu ra của các khóa học iSpring sẽ không gây ngạc nhiên. Các khóa học dựa trên slide có thể được điều chỉnh và chuyển đổi thành các khóa học tùy chỉnh, hấp dẫn hơn. Kết quả cuối cùng trông sạch sẽ và chuyên nghiệp, nhưng nó vẫn có cảm giác PP đó!

    Tốc độ và hiệu quả của tác giả

    Đối với các tác giả PP đã thành lập, iSpring Suite nên có một đường cong học tập khá nhỏ. Cho phép tạo các khóa học elearning cơ bản, đáp ứng một cách nhanh chóng và dễ dàng. Được kết nối trực tiếp với đám mây, các khóa học có thể được tải lên trực tuyến trực tuyến hoặc lưu cục bộ. Mặc dù, khi bạn tiến xa hơn, các vấn đề về công cụ có thể phát sinh có thể cản trở thời gian sản xuất.

    Khả năng mở rộng

    Các lộ trình học tập có thể được tạo, lưu và sử dụng lại trong iSpring để truy cập nhanh chóng. Các khóa học đã hoàn thành sau đó có thể được tải trực tiếp lên đám mây để người học truy cập trực tuyến hoặc ngoại tuyến! Các khóa học có thể được triển khai thông qua Hệ thống quản lý học tập hoặc LMS của riêng iSpring.

    Các định dạng elearning được hỗ trợ

    iSpring là một công cụ soạn thảo dựa trên máy tính để bàn, với một số chức năng trực tuyến. Nó chủ yếu là một phần mềm nâng cấp dựa trên windows – bạn có thể nhập PowerPoint của mình và tạo nội dung HTML5, tuân thủ SCORM.

    Hỗ trợ:

    • HTML5, Video, SCORM, xAPI (TinCan), cmi5
    • các cửa sổ

    Điểm mạnh của iSpring Suite

    • Tích hợp PowerPoint
    • Đường cong học tập thấp (nếu có kinh nghiệm trong PP)
    • Giao diện đơn giản
    • Chỉnh sửa video
    • Tuyệt vời cho người dùng Windows

    Điểm yếu của iSpring Suite

    • Không khả dụng cho người dùng Mac (không có phần mềm khác)
    • Không thể tạo các khóa học dựa trên trang trình bày mà không có PowerPoint
    • Không hoàn toàn dựa trên đám mây
    • Yêu cầu cài đặt
    • Đầu ra cơ bản

    Tốt nhất cho:

    • Giới thiệu nhanh chóng và dễ dàng
    • Đầu ra Elearning đơn giản, đáp ứng
    • Sản xuất video Elearning
    • Tùy chọn phân phối nội dung dễ dàng

    11. Evolve

    Evolve là một công cụ soạn thảo nâng cao trực tuyến xây dựng nội dung nâng cao trực quan, dựa trên HTML5. Các khóa học được xây dựng trong công cụ này sẽ hoạt động trên mọi nền tảng, thiết bị hoặc hệ thống. Phần mềm tác giả được thiết kế cho các tác giả mới làm quen, có nghĩa là nó nhanh chóng và dễ dàng để tạo nội dung đơn giản.

    12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING 10

    Chất lượng đầu ra Elearning

    Evolve cho phép người dùng tạo nội dung đơn giản một cách nhanh chóng. Nó có một loạt các thành phần và tất cả đều dễ sử dụng.

    Tốc độ và hiệu quả của tác giả

    Với một loạt các mẫu được tạo sẵn sẵn sàng để sử dụng, bạn không cần phải mất nhiều thời gian để thiết kế một khóa học. Chỉ cần chọn một ‘khối’ phù hợp với nhu cầu của bạn và bắt đầu thêm nội dung.

    Khả năng mở rộng

    Tác giả có thể vui vẻ áp dụng thương hiệu trong toàn bộ khóa học và thực hiện các thay đổi sâu rộng trong vòng vài phút. Cho dù bạn đang xây dựng một hay một nghìn khóa học, phần mềm tạo khóa học Evolve sẽ giúp việc xây dựng thương hiệu trở nên đơn giản.

    Các định dạng elearning được hỗ trợ

    Evolve là một công cụ soạn thảo trực tuyến phát hành các khóa học qua web hoặc ngoại tuyến. Nền tảng cung cấp cho người dùng khả năng tạo nội dung HTML5 hoạt động trên mọi thiết bị.

    Hỗ trợ:

    • HTML5, SCORM 1.2 / 2004, Web, Ngoại tuyến
    • các cửa sổ

    Phát triển điểm mạnh

    • Tương tác mới lạ với các loại không được thấy trong một số công cụ khác
    • Thanh toán cho thời gian bạn đang sử dụng thay vì cho cả năm
    • Tác giả cộng tác dễ dàng và đơn giản

    Phát triển điểm yếu

    • Phạm vi cài đặt phức tạp được định cấu hình cho từng phần tử
    • Không có cách nào để quản lý các biến thể của các khóa học
    • Giới hạn trong một cấu trúc tuyến tính

    Tốt nhất cho:

    • Tác giả mới
    • Tùy chọn giá linh hoạt
    • Tạo nội dung với thương hiệu nhất quán
    • Sản xuất nội dung cơ bản nhanh chóng và dễ dàng

    12. Camtasia

    Camtasia là bộ phần mềm tất cả trong một để quay màn hình và chỉnh sửa video. Mặc dù trước hết là một công cụ quay video, nội dung có thể được xuất dưới dạng gói SCORM. Phần mềm này được sử dụng phổ biến nhất để sản xuất video hướng dẫn, bài học hoặc demo sản phẩm – biến chúng thành video hấp dẫn hơn thông qua hoạt ảnh và hiệu ứng.

    Trang chủ https://www.techsmith.com/video-editor.html

    Do tập trung chủ yếu vào video, Camtasia thường được tích hợp hoặc sử dụng cùng với các nền tảng tác giả nâng cấp khác.

    12 PHẦN MỀM TẠO BÀI GIẢNG E-LEARNING 11

    Chất lượng đầu ra Elearning

    Nếu bạn đang chọn video làm phương pháp đào tạo của mình và cần một trình chỉnh sửa linh hoạt để giúp đưa việc quay màn hình của bạn tiến xa hơn, thì Camtasia là một lựa chọn tuyệt vời. Bộ phần mềm cho phép người dùng thêm các lớp tương tác và câu đố bổ sung để khuyến khích và đo lường việc học trong video.

    Tốc độ và hiệu quả của tác giả

    Camtasia được thiết kế để tạo tác giả nhanh chóng và dễ dàng. Một giao diện kéo và thả đơn giản giúp việc thêm, xóa hoặc cắt video trở nên khá đơn giản đối với những người đã sử dụng trình chỉnh sửa video trước đây.

    Khả năng mở rộng

    Như với bất kỳ phần mềm video nào, khả năng mở rộng có thể phức tạp.

    Ngoài ra, bạn có thể tải ngay nội dung video lên YouTube, Vimeo, Screencast hoặc khóa học video trực tuyến của mình. Mặc dù sau khi video đã được phát hành, bạn sẽ không thể cập nhật video đó.

    Các định dạng elearning được hỗ trợ

    Camtasia là bộ chỉnh sửa video có thể xuất ra hầu hết các định dạng video. Phần mềm sẽ không xuất sang flash hoặc HTML-5, nhưng có tùy chọn SCORM ..

    Hỗ trợ:

    • SCORM 1.2 / 2004, Web, Ngoại tuyến
    • các cửa sổ
    • Ứng dụng iOS

    Điểm mạnh của Camtasia

    • Tuyệt vời để chụp màn hình và chỉnh sửa video
    • Khả năng lưu và sử dụng lại các cài đặt trước và mẫu
    • Tích hợp PowerPoint
    • chụp iOS

    Điểm yếu của Camtasia

    • Không khả dụng cho người dùng Mac (không có phần mềm khác)
    • Không thể tạo các khóa học dựa trên trang trình bày mà không có PowerPoint
    • Không hoàn toàn dựa trên đám mây
    • Yêu cầu cài đặt
    • Đầu ra cơ bản
  • Bài toán Tháp Hà Nội (Tower of Hanoi)

    Bài toán Tháp Hà Nội (Tower of Hanoi)

    Bài toán Tháp Hà Nội (Tower of Hanoi)

    Bài toán Tháp Hà Nội là một bài toán rất nổi tiếng và kinh điển, rất thích hợp để minh họa cho thuật toán đệ quy.

    Bài toán Tháp Hà Nội là gì?

    Có 3 chiếc cọc được đánh dấu lần lượt là A, B, C và n chiếc đĩa. Các đĩa này có kích thước (đường kính) khác nhau và mỗi đĩa đều có một lỗ ở giữa để lồng vào cọc. Ban đầu, các đĩa đều nằm ở cọc A, trong đó, đĩa có đường kính nhỏ hơn luôn ở nằm trên đĩa đường kính lớn hơn.

    bài toán tháp hà nội

    Yêu cầu : Chuyển n đĩa từ cọc A sang cọc C với các điều kiện sau:

    • Mỗi lần chỉ chuyển được 1 đĩa
    • Trong quá trình chuyển, đĩa nhỏ phải luôn nằm trên đĩa lớn hơn.
    • Cho phép sử dụng cọc B làm cọc trung gian

    Cách giải Bài toán Tháp Hà Nội

    Chúng ta sẽ xét các trường hợp của n:

    • Trường hợp đơn giản nhất, n=1, ta chỉ cần chuyển 1 đĩa từ cọc A sang cọc C.
    • Với n=2, ta chuyển đĩa nhỏ nhất sang cọc B, chuyển đĩa còn lại sang cọc C, và cuối cùng chuyển đĩa nhỏ ở cọc B sang cọc C.
    • Với n>2, giả sử ta đã có cách chuyển n-1 đĩa từ một cọc sang một cọc khác. Như vậy, để chuyển n đĩa từ cọc nguồn sang cọc đích, ta cần chuyển n-1 đĩa từ cọc nguồn sang cọc trung gian. Sau đó chuyển đĩa lớn nhất từ cọc nguồn sang cọc đích. Cuối cùng, chuyển n-1 đĩa từ cọc trung gian sang cọc đích.

    Ví dụ, với n=3, chúng ta phải chuyển 7 lần tất cả như hình sau.

    cách giải bài toán tháp hà nội

    Mã nguồn chương trình bằng Python:

    def TowerOfHanoi(n , source, destination, auxiliary):
       if n==1:
          print("Chuyển đĩa 1 từ cọc",source,"sang cọc",destination)
          return
       TowerOfHanoi(n-1, source, auxiliary, destination)
       print("Chuyển đĩa",n,"từ cọc",source,"sang cọc",destination)
       TowerOfHanoi(n-1, auxiliary, destination, source)
    
    # Ví dụ với n = 4		
    n = 4
    TowerOfHanoi(n,'A','C','B')

    Kết quả chạy chương trình:

    Chuyển đĩa 1 từ cọc A sang cọc B
    Chuyển đĩa 2 từ cọc A sang cọc C
    Chuyển đĩa 1 từ cọc B sang cọc C
    Chuyển đĩa 3 từ cọc A sang cọc B
    Chuyển đĩa 1 từ cọc C sang cọc A
    Chuyển đĩa 2 từ cọc C sang cọc B
    Chuyển đĩa 1 từ cọc A sang cọc B
    Chuyển đĩa 4 từ cọc A sang cọc C
    Chuyển đĩa 1 từ cọc B sang cọc C
    Chuyển đĩa 2 từ cọc B sang cọc A
    Chuyển đĩa 1 từ cọc C sang cọc A
    Chuyển đĩa 3 từ cọc B sang cọc C
    Chuyển đĩa 1 từ cọc A sang cọc B
    Chuyển đĩa 2 từ cọc A sang cọc C
    Chuyển đĩa 1 từ cọc B sang cọc C
  • Giải thuật Đệ quy là gì?

    Giải thuật Đệ quy là gì?

    Giải thuật Đệ quy là gì?

    Đệ quy (recursion) xảy ra khi một sự vật được định nghĩa theo chính nó hoặc thuộc loại của nó. Đệ quy được sử dụng trong nhiều lĩnh vực khác nhau, từ ngôn ngữ học đến logic.

    Ví dụ dễ hiểu nhất của đệ quy là một người đứng bên cạnh một TV đang ghi hình trực tiếp chính người đó như trong hình ảnh dưới đây. Lúc đó, trong TV lại có hình ảnh người đó bên cạnh chiếc TV…

    Giải thuật Đệ quy là gì? 12

    Hoặc trên bìa sách Toán 3 có hình ảnh các em học sinh đang cầm cuốn sách Toán lớp 3.

    chương trình đệ quy là gì

    Ứng dụng phổ biến nhất của đệ quy là trong toán học và khoa học máy tính, trong đó một hàm được định nghĩa bằng cách sử dụng theo định nghĩa của chính nó. Trong Toán học, đệ qui xuất hiện trong các bài toán sử dụng phương pháp quy nạp toán học, các bài toán dãy số sử dụng công thức truy hồi.

    1. Giải thuật Đệ quy là gì?

    Trong lập trình, một đối tượng (hàm, class…) được gọi là đệ quy nếu nó hoặc một phần của nó được định nghĩa thông qua chính nó.

    Chúng ta thường gặp nhiều nhất là các hàm đệ quy. Chẳng hạn, ta có hàm factorial(n) để tính giai thừa của số tự nhiên n thì hàm này có thể được định nghĩa thông qua lời gọi đến chính nó là factorial(n) = n * factorial(n-1)

    Tuy nhiên, cũng giống như phương pháp quy nạp trong Toán học. Nếu cứ gọi đến chính nó mãi như thế thì chương trình không có điểm dừng, nên chúng ta luôn phải có những trường hợp đặc biệt được tính toán/quy ước sẵn. Chẳng hạn, đối với hàm tính giai thừa, chúng ta phải quy ước factorial(0) = 1 để chương trình gọi đến factorial(0) thì sẽ dừng lại và sử dụng luôn giá trị được cung cấp sẵn này. Mời bạn xem chi tiết chương trình tính giai thừa ở phần sau bài viết này.

    Hàm đệ quy có thể chứa lời gọi trực tiếp đến chính nó hoặc lời gọi đến hàm khác mà hàm này lại chứa lời gọi đến chính nó.

    2. Đặc điểm của hàm đệ quy

    Một hàm đệ quy gồm 2 phần:

    • Phần cơ sở: Điều kiện để thoát khỏi đệ quy. Nếu như không có phần này, hàm đệ quy sẽ thực hiện mãi mãi gây ra tràn bộ nhớ Stack.
    • Phần đệ quy: Thân hàm có chứa phần gọi đệ quy, thực hiện cho đến khi thỏa mãn điều kiện ở phần cơ sở.

    Ưu nhược điểm của chương trình đệ quy

    • Ưu điểm: Chương trình rất ngắn gọn và dễ đọc, dễ hiểu.
    • Nhược điểm: Chương trình chạy chậm và tốn nhiều bộ nhớ.

    Bài toán đệ quy

    Đó là những bài toán mang bản chất đệ quy. Nghĩa là những bài toán này có thể được phân rã thành các bài toán nhỏ hơn, đơn giản hơn nhưng có cùng dạng với bài toán ban đầu. Những bài toán nhỏ lại được phân rã thành các bài toán nhỏ hơn. Cứ như vậy, việc phân rã chỉ dừng lại khi bài toán con đơn giản đến mức có thể suy ra ngay kết quả mà không cần phải phân rã nữa. Ta phải giải tất cả các bài toán con rồi kết hợp các kết quả đó lại để có được lời giải cho bài toán lớn ban đầu. Cách phân rã bài toán như vậy gọi là “chia để trị” (devide and conquer), là một dạng của đệ quy.

    3. Một số ví dụ về đệ quy

    Một số ví dụ kinh điển về đệ quy như hàm tính giai thừa, tính tổng, tìm số hạng của dãy Fibonacci… Dưới đây, chúng ta cùng sử dụng ngôn ngữ Dart để giải quyết các bài toán này.

    Tính giai thừa bằng đệ quy

    Đề bài. Viết chương trình tính giai thừa của một số tự nhiên n.

    Giả mã của hàm tính giai thừa factorial(n) như sau:

    def factorial(n) {
      nếu n = 0 trả về kết quả 1;
      nếu n > 0 trả về kết quả n * factorial(n-1);
    }

    Dưới đây là mã nguồn chương trình viết bằng ngôn ngữ Python

    def factorial(n):     
        if (n==1 or n==0):
            return 1
        else:
            return (n * factorial(n - 1)) 
    
    print(factorial(7))//kết quả 5040

    Mã nguồn viết bằng ngôn ngữ Dart

    int factorial(int n) {
      if (n == 0)
        return 1;
      else
        return n * factorial(n - 1);
    }
    
    void main() {
      print(factorial(6)); //kết quả 720
    }

    Bạn có thể tham khảo thêm các bài tập khác bằng ngôn ngữ Dart 50 bài tập lập trình Dart cơ bản

    Tính tổng bằng đệ quy

    Viết chương trình tính tổng các số tự nhiên từ 1 tới n, sử dụng đệ quy.

    int sum(int n) {
      if (n == 1)
        return 1;
      else
        return n + sum(n - 1);
    }
    
    void main() {
      print(sum(100)); //kết quả 5050
    }

    Tìm số Fibonacci bằng đệ quy

    Viết chương trình tính số fibonacci thứ n.

    int fibo(int n) {
      if (n == 1 || n == 2)
        return 1;
      else
        return fibo(n-1) + fibo(n-2);
    }
    
    void main() {
      print(fibo(20)); //kết quả 6765
    }

    Tính số tổ hợp bằng đệ quy

    Viết chương trình tính số tổ hợp chập k của n phần tử.

    Chúng ta sử dụng 3 kiến thức sau:

    • $C^k_n=C^{k}_{n-1}+C^{k-1}_{n-1}$
    • $C^0_n=C^{n}_{n}=1$
    • $C^1_n=n$

    Mã nguồn chương trình như sau:

    int bin_coefficient(int k, int n) {
      if (k == 0 || k == n) return 1;
      if (k == 1) return n;
      return bin_coefficient(k, n - 1) + bin_coefficient(k - 1, n - 1);
    }
    
    void main() {
      print(bin_coefficient(3, 5)); //kết quả 10
      print(bin_coefficient(7, 10)); //kết quả 120
    }

    Bạn có thể xem thêm Bài toán Tháp Hà Nội được giải bằng đệ quy.

    bài toán tháp hà nội

    Các loại bài toán đệ quy

    Đệ quy có thể được phân chia thành các loại:

    • Đệ quy tuyến tính (Linear Recursion): Mỗi lần thực thi chỉ gọi đệ quy một lần, chẳng hạn hàm tính giai thừa.
    • Đệ quy nhị phân (Binary Recursion): Mỗi lần thực thi có thể gọi đệ quy 2 lần, ví dụ tính số tổ hợp chập k của n, hoặc tìm số Fibonacci ở trên.
    • Đệ quy lồng nhau (Nested Recursion): Tham số trong lời gọi đệ quy là một lời gọi đệ quy, đệ quy lồng chiếm bộ nhớ rất nhanh.
    • Đệ quy tương hỗ (Mutual Recursion): Các hàm gọi đệ quy lẫn nhau.
    • Quay lui (Backtracking). Trong lập trình, có một chiến lược giải bài toán một cách đầy đủ nhất, đảm bảo đủ mọi trường hợp bằng phương pháp Thử và Sai (Try and Error). Bạn có thể xem thêm trong bài toán Thuật toán quay lui và minh họa. Ví dụ điển hình là Bài toán xếp hậu (N-Queens)

    4. Bài tập lập trình sử dụng Đệ quy

    Sử dụng đệ quy quay lui để giải bài tập sau:

    Bài 1. Viết chương trình tính tích các số tự nhiên liên tiếp từ 1 tới n.

    Bài 2. Viết chương trình tính tổng các số tự nhiên lẻ liên tiếp từ 1 tới n.

    Bài 3. Viết chương trình tính tích các số tự nhiên liên tiếp từ 1 tới n.

    Bài 4. Đếm số lượng chữ số của số nguyên dương n.

    Bài 5. Tìm UCLN của 2 số nguyên dương ab.

    Bài 6. Tính lũy thừa n^k với nk là hai số nguyên dương được nhập vào từ bàn phím.

  • Sàng số nguyên tố (Sàng Eratosthenes)

    Sàng số nguyên tố (Sàng Eratosthenes)

    Sàng số nguyên tố (Sàng Eratosthenes)

    Bài toán liệt kê các số nguyên tố nhỏ hơn số n cho trước là một bài toán quan trọng trong Toán học và Tin học.

    Phương pháp đơn giản nhất là chúng ta duyệt qua các số tự nhiên nhỏ hơn n, và lần lượt kiểm tra tính nguyên tố của từng số này. Tuy nhiên, việc kiểm tra tính nguyên tố của một số tự nhiên n có độ phức tạp là $O(\sqrt{n})$, do đó duyệt qua n số này sẽ có độ phức tạp $O(\sqrt{1}+\sqrt{2}+\sqrt{3}+…+\sqrt{n})$.

    Cách làm dưới đây sẽ giúp giảm độ phức tạp của chương trình đi rất nhiều.

    Sàng Eratosthenes là gì?

    Sàng Eratosthenes là một thuật giải toán cổ xưa để tìm các số nguyên tố nhỏ hơn 100. Thuật toán này do nhà toán học cổ Hy Lạp là Eratosthenes (Ơ-ra-tô-xten) “phát minh” ra.

    Ban đầu, nhà toán học Eratosthenes sau khi tìm ra thuật toán, đã lấy lá cọ và ghi tất cả các số từ 2 cho đến 100. Ông đã chọc thủng các hợp số và giữ nguyên các số nguyên tố. Bảng số nguyên tố còn lại trông rất giống một cái sàng. Do đó, nó có tên là sàng Eratosthenes.

    Bạn có thể xem trong hình dưới đây, các số tô màu giống nhau là bội của nhau số cùng màu nhưng được tô đậm hơn.

    sàng số nguyên tố Sàng Eratosthenes

    Thuật toán sàng số nguyên tố

    Để tìm các số nguyên tố nhỏ hơn hoặc bằng số tự nhiên N bằng sàng Eratosthenes, ta làm như sau:

    • Bước 1: Tạo 1 danh sách (List trong Python, Dart hoặc array trong C)các số tự nhiên liên tiếp từ 2 đến n: [2, 3, 4,..., n].
    • Bước 2: Giả sử tất cả các số trong danh sách đều là số nguyên tố. Trong đó, p = 2 là số nguyên tố đầu tiên.
    • Bước 3: Tất cả các bội số của p: 2p, 3p, 4p,… sẽ bị đánh dấu vì không phải là số nguyên tố.
    • Bước 4: Tìm các số còn lại trong danh sách mà chưa bị đánh dấu và phải lớn hơn p và nhỏ hơn hoặc bằng căn bậc 2 của n . Nếu không còn số nào, dừng tìm kiếm. Ngược lại, gán cho p giá trị bằng số nguyên tố tiếp theo và quay lại bước 3.

    Khi giải thuật kết thúc, tất các số chưa bị đánh dấu trong danh sách là các số nguyên tố cần tìm.

    Thay vì phải đánh dấu, chúng ta có thể xóa phần tử không là số nguyên tố của danh sách thì cuối cùng sẽ còn lại là các số nguyên tố.

    Mời bạn tham khảo mã nguồn chương trình bằng Python:

    def SieveOfEratosthenes(n):
       
       # Create a boolean array "prime[0..n]" and initialize
       # all entries it as true. A value in prime[i] will
       # finally be false if i is Not a prime, else true.
       prime = [True for i in range(n + 1)]
       p = 2
       while (p * p <= n):
          
          # If prime[p] is not changed, then it is a prime
          if (prime[p] == True):
             
             # Update all multiples of p
             for i in range(p ** 2, n + 1, p):
                prime[i] = False
          p += 1
       prime[0]= False
       prime[1]= False
       # Print all prime numbers
       for p in range(n + 1):
          if prime[p]:
             print(p)
    if __name__=='__main__':
       n = 30
       print("Following are the prime numbers smaller than or equal to", n)
       SieveOfEratosthenes(n)
    
  • Thuật toán kiểm tra Số Nguyên Tố

    Thuật toán kiểm tra Số Nguyên Tố

    Thuật toán kiểm tra Số Nguyên Tố

    Thuật toán kiểm tra Số Nguyên Tố của một số nguyên dương, cùng với thuật toán tìm UCLN của hai số tự nhiên là những bài toán quan trọng trong Lập trình.

    Kiểm tra tính nguyên tố là bài toán kiểm tra xem một số tự nhiên n có phải là số nguyên tố hay không. Bài toán này đặc biệt trở nên quan trọng khi các hệ mật mã khoá công khai ra đời.

    1. Số nguyên tố là gì?

    Số nguyên tố (prime) là số tự nhiên lớn hơn 1, chỉ có hai ước số là 1 và chính nó. Theo định nghĩa này thì các số 2, 3, 5, 7, 11,… là các số nguyên tố, trong đó số 2 là số nguyên tố chẵn duy nhất.

    số nguyên tố là gì

    Ví dụ: 7 là số nguyên tố vì trong khoảng từ 2 đến 6 không tồn tại số nào mà 7 chia hết cả.

    2. Các Thuật toán kiểm tra Số Nguyên Tố Đơn Giản

    Phương pháp đơn giản nhất để kiểm tra một số n có là số nguyên tố không là kiểm tra xem nó có chia hết cho các số m nằm trong khoảng 2 đến n-1 hay không.

    Nếu n chia hết cho một trong các số m nào đó thì n không là số nguyên tố (còn được gọi là hợp số composite). Ngược lại, nếu n không chia hết cho bất kì số m nào thì kết lianaj n là số nguyên tố.

    Thực ra việc kiểm tra với m từ 2 đến n-1 là không cần thiết, mà chỉ cần kiểm tra đến $\sqrt{n}$ là đủ. Vì nếu n là hợp số thì nó chắc chắn có ước số không vượt quá sqrt(n).

    Lặp từng phần tử với bước nhảy 1 đến n-1

    Giả sử cần kiểm tra số n có phải là số nguyên tố hay không thì các bước thực hiện như sau:

    • Bước 1: Nhập vào n
    • Bước 2: Kiểm tra nếu n < 2 thì kết luận n không phải là số nguyên tố
    • Bước 3: Lặp từ 2 tới (n-1), nếu trong khoảng này tồn tại số mà n chia hết thì kết luận n không phải là số nguyên tố, ngược lại n là số nguyên tố.

    Độ phức tạp của thuật toán trên là $O(n)$.

    Lặp từng phần tử với bước nhảy 2

    Theo định nghĩa thì số 2 là số nguyên tố chẵn duy nhất, vì vậy ta sẽ loại 2 ra khỏi vòng lặp và trong thân vòng lặp chỉ kiểm tra các số lẻ mà thôi, cách này sẽ tối ưu hơn cách 1 rất nhiều.

    • Bước 1: Nhập vào n;
    • Bước 2: Kiểm tra nếu n < 2 thì kết luận n không phải là số nguyên tố;
    • Bước 3: Kiểm tra nếu n = 2 thì kết luận n là số nguyên tố;
    • Bước 4: Kiểm tra nếu n > 2 và chẵn thì kết luận n không phải là số nguyên tố;
    • Bước 5. Lặp từ 3 tới (n-1), bước nhảy là 2 nếu trong khoảng này tồn tại số mà n chia hết thì kết luận n không phải là số nguyên tố, ngược lại n là số nguyên tố.

    Lặp từng phần tử đến $\sqrt{n}$

    Để tối ưu hơn, thay vì lặp tới n-1, chúng ta chỉ cần lặp các số từ 2 đến sqrt(n), nếu n chia hết cho một trong những số đó thì n không phải là số nguyên tố. Ngược lại thì n là số nguyên tố.

    Độ phức tạp của thuật toán trên là $O(\sqrt{n})$.

    Xem mã nguồn viết bằng ngôn ngữ Dart tại đây https://divin.dev/dart/2021/10/14/bai-tap-dart-17.html

    3. Tối ưu thuật toán kiểm tra số nguyên tố

    Chúng ta có thể tối ưu thuật toán trên bằng cách chỉ ra n không chia hết cho những số nguyên tố nhỏ hơn nó. Tuy nhiên, chúng ta lại chưa biết được các số nguyên tố nhỏ hơn nó là những số nào (Bạn có thể sử dụng phương pháp sàng số nguyên tố – Sàng Eratosthenes để tìm ra các số nguyên tố nhỏ hơn số n cho trước). Nên ta sử dụng kết quả sau đây:

    Tất cả những số nguyên tố lớn hơn 3 đều có dạng 6k ± 1 (vì 6k, 6k ± 2, là những số chẵn; 6k + 3 thì chia hết cho 3).

    Do đó, chúng ta chỉ cần kiểm tra các số có dạng 6k ± 1 từ 2 đến √n, nếu n chia hết cho một trong những số đó thì n không phải là số nguyên tố. Ngược lại thì n là số nguyên tố.

    def is_prime(n: int) -> bool:
        """Primality test using 6k+-1 optimization."""
        if n <= 3:
            return n > 1
        if n % 2 == 0 or n % 3 == 0:
            return False
        i = 5
        while i ** 2 <= n:
            if n % i == 0 or n % (i + 2) == 0:
                return False
            i += 6
        return True

    4. Các Thuật toán kiểm tra Số Nguyên Tố Nâng Cao

    Các cách kiểm tra số nguyên tố kể trên có độ chính xác tuyệt đối nhưng khối lượng tính toán rất lớn. Theo Wiki thì chúng ta còn có những cách khác để kiểm tra tính nguyên tố của một số với một độ chính xác cho trước.

    Kiểm tra theo xác suất

    Các phép kiểm tra tính nguyên tố hay dùng nhất là các thuật toán ngẫu nhiên.

    Giả sử có một mệnh đề Q(p,a) nào đó đúng với mọi số nguyên tố p và một số tự nhiên a <= p. Nếu n là một số tự nhiên lẻ và mệnh đề Q(n,a) đúng với một a<= n được lấy ngẫu nhiên, khi đó a có khả năng là một số nguyên tố.

    Ta đưa ra một thuật toán, kết luận rằng n là số nguyên tố. Nó là một thuật toán ngẫu nhiên hay thuật toán xác suất. Trong các thuật toán loại này, dùng một kiểm tra ngẫu nhiên sẽ không bao giờ kết luận một số nguyên tố là hợp số nhưng lại có thể kết luận một hợp số là số nguyên tố. Do đó, phương pháp này không chính xác một cách tuyệt đối.

    Xác suất sai của phép kiểm tra có thể giảm xuống nhờ việc chọn một dãy độc lập các số a; nếu với mỗi số a xác suất để thuật toán kết luận một hợp số là số nguyên tố là nhỏ hơn một nửa thì sau k lần thử độc lập, xác suất sai là nhỏ hơn 2^k, độ tin cậy của thuật toán sẽ tăng lên theo k.

    Cấu trúc cơ bản của một phép kiểm tra ngẫu nhiên là:

    • Chọn một số ngẫu nhiên a.
    • Kiểm tra một hệ thức nào đó giữa số a và số n đã cho. Nếu hệ thức sai thì chắc chắn n là một hợp số (số a là “bằng chứng” chứng tỏ n là hợp số) và dừng thuật toán.
    • Nếu hệ thức đúng, chúng ta lặp lại hai bước trên cho đến khi đạt được một số lần định trước hoặc gặp trường hợp dừng thuật toán.

    Sau nhiều lần thử, nếu hệ thức đúng với nhiều giá trị của a, ta có thể nói rằng n “có khả năng cao” là số nguyên tố chứ không thể chắc chắn n là số nguyên tố. Tất nhiên là chúng ta sẽ tìm cách tăng “khả năng” này lên bằng cách thực hiện nhiều tính toán hơn.

    Các hệ thức thường sử dụng

    Nếu p là một số nguyên tố thì

    • 2p - 1 ≡ 1 (mod p) (đây là nội dung của định lí Fermat nhỏ)
    • fp + 1 ≡ 0 (mod p) (với fp + 1 là số Fibonacci thứ p + 1 và p có dạng 5k ± 2)
    • (p - 1)! ≡ -1 (mod p) khi và chỉ khi p nguyên tố. Đây là nội dung của định lí Wilson, nhưng việc tính toán biểu thức (n - 1)! % n sẽ có độ phức tạp lớn hơn log n.

    Các phép kiểm tra tính nguyên tố ngẫu nhiên là:

    • Phép kiểm tra tính nguyên tố của Fermat (kiểm tra Fermat). Đây là phép thử heuristic; tuy nhiên ít người sử dung phép thử này.
    • Kiểm tra Miller-Rabin và Kiểm tra Solovay-Strassen. Với mỗi hợp số n, ít nhất 3/4 (với kiểm tra Miller-Rabin) hoặc 1/2 (Với kiểm tra Solovay-Strassen) các số a là bằng chứng chứng tỏ n là hợp số).

    thuật toán kiểm tra số nguyên tố

    Các phép kiểm tra tất định

    Vào năm 2002, Manindra Agrawal, Nitin Saxena và Neeraj Kayal đề xuất một giải thuật tất định kiểm tra tính nguyên tố, là kiểm tra AKS, có khả năng chạy trong O((log n)12). Trên thực tế thuật toán này chạy chậm hơn các phương pháp xác suất.

    Các phương pháp này, mời bạn đọc tham khảo thêm tại https://en.wikipedia.org/wiki/Primality_test

     

  • 10 HÀM EXCEL THÔNG DỤNG NHẤT

    10 HÀM EXCEL THÔNG DỤNG NHẤT

    Sau đây là 10 hàm Excel mà mọi người đọc nhiều nhất.

    HÀM MÔ TẢ VÍ DỤ
    SUM
    • Dùng hàm này để cộng giá trị trong các ô.
    • Cú pháp: SUM(Range) trong đó Range là các ô mà bạn muốn tính giá trị.
    =SUM(A1,A2,B1:B7)

    Tính tổng giá trị của các ô A1, A2 và từ B1, B2,… đến B7)

    SUMIF
    • Dùng hàm này để tính tổng giá trị trong các ô thỏa mãn điều kiện.
    • Cú pháp: SUMIF(Range, Criteria, Sum_range)
    • Trong đó:
      • Range: Là hàng hoặc cột mà bạn đã chọn.
      • Criteria: Đặt điều kiện, điều kiện này bạn có thể đặt là số, là biểu thức hoặc là chuỗi đều được.
      • Sum_range: Là các ô mà bạn thực sự cần tính tổng.
    =SUMIF(B3:B8,"<=8")

    Tính tổng của các giá trị trong vùng chọn từ B2 đến B5 và với điều kiện là các giá trị nhỏ hơn hoặc bằng 8.

    IF
    • Dùng hàm này để trả về một giá trị nếu một điều kiện là đúng và giá trị khác nếu điều kiện là sai.
    • Cú pháp: =IF(Điều kiện; Giá trị 1, Giá trị 2)
    • Nếu đúng với điều kiện thì kết quả sẽ trả về là Giá trị 1, còn nếu sai thì sẽ trả về là Giá trị 2.
    =IF(D6=120;"CÓ","KHÔNG")

    Trả về giá trị là xâu kí tự “CÓ” nếu ô D6 có giá trị bằng 120, nếu không thì trả về “KHÔNG”

    LOOKUP
    • Sử dụng để tra cứu và tham chiếu, khi bạn cần xem một hàng hay một cột và tìm một giá trị từ cùng một vị trí trong hàng hay cột thứ hai.
    • Cú pháp: LOOKUP(lookup_value, lookup_vector, [result_vector])
    • lookup_value Bắt buộc. Giá trị mà hàm LOOKUP tìm kiếm trong lookup_vector.
    • lookup_vector Bắt buộc. Phạm vi chỉ chứa một hàng hoặc một cột. Các giá trị trong lookup_vector phải được xếp theo thứ tự tăng dần: …, -2, -1, 0, 1, 2, …, A-Z, FALSE, TRUE. Văn bản chữ hoa và chữ thường tương đương nhau.
    • result_vector Tùy chọn. Phạm vi chỉ chứa một hàng hay một cột.
    VLOOKUP
    • Hàm VLOOKUP là hàm tìm kiếm giá trị theo cột kèm theo điều kiện tham chiếu.
    • Cú pháp: VLOOKUP (điều kiện tìm kiếm,vùng dữ liệu cần tìm kiếm,số cột tìm kiếm,kiểu tìm kiếm 0/1)
    • Trong đó:
      • 0 – là kiểu tìm kiếm chính xác
      • 1 – kiểu tìm kiếm tương đối
    MATCH
    • Sử dụng hàm này để tìm kiếm một mục trong một phạm vi ô, rồi trả về vị trí tương đối của mục đó trong phạm vi.
    Ví dụ, nếu phạm vi A1: A3 có chứa các giá trị 5, 7 và 38, thì công thức = MATCH (7, A1: A3, 0) trả về số 2, vì 7 là mục thứ hai trong phạm vi.
    CHOOSE
    • Dùng hàm này để chọn một trong tối đa 254 giá trị dựa trên số chỉ mục.
    Ví dụ, nếu value1 đến hết value7 là các ngày trong tuần, CHOOSE trả về một trong các ngày khi dùng một số từ 1 đến 7 làm index_num.
    DATE
    • Dùng hàm này để trả về số sê-ri lần lượt đại diện cho một ngày cụ thể. Hàm này hữu ích nhất trong những trường hợp mà năm, tháng và ngày được cung cấp bởi các công thức hoặc tham chiếu ô.
    • Dùng hàm DATEDIF để tính toán số ngày, tháng hoặc năm giữa hai ngày.
    Ví dụ, bạn có thể có một trang tính chứa ngày tháng theo định dạng mà Excel không nhận ra, chẳng hạn như YYYYMMDD.
    DAYS
    • Dùng hàm này để trả về số ngày giữa hai ngày.
    FIND

    FINDB

    • Tìm và FINDB xác định vị trí một chuỗi văn bản trong chuỗi văn bản thứ hai.
    • Chúng trả về số của vị trí bắt đầu của chuỗi văn bản đầu tiên từ ký tự đầu tiên của chuỗi văn bản thứ hai.
    INDEX
    • Dùng hàm này để trả về một giá trị hoặc tham chiếu tới một giá trị từ trong bảng hoặc phạm vi.

     

  • Thuật toán tìm UCLN của hai số nguyên dương

    Thuật toán tìm UCLN của hai số nguyên dương

    Thuật toán tìm UCLN của hai số nguyên dương

    UCLN (ước chung lớn nhất) của 2 số là gì?

    Ước chung lớn nhất (UCLN, tiếng Anh là GCD – Greatest Common Divisor) của 2 số nguyên dương ab là số nguyên lớn nhất d thỏa mãn tính chất cả ab đều chia hết cho d.

    Ví dụ, UCLN của 103555 là số nguyên lớn nhất mà cả 1035 đều chia hết cho 5.

    Thuật toán tìm UCLN của hai số nguyên dương

    Có nhiều thuật toán tìm UCLN của hai số nguyên, bạn có thể tham khảo thêm ở Wikipedia. Dưới đây, chúng tôi giới thiệu thuật toán tìm UCLN của hai số nguyên giải thuật Euclid. Cơ sở của giải thuật Euclid tìm UCLN của hai số nguyên ab dựa trên tính chất sau.

    Giả sử a >= b thì khi chia a cho b ta được thương q và số dư r, tức là

    a = b*q + r

    Khi đó:

    • Nếu r = 0 thì UCLN(a,b) = b
    • Nếu r >0 thì UCLN(a,b) = UCLN(b,r)

    Tìm UCLN của hai số nguyên bằng phép chia

    Áp dụng giải thuật Euclid để tính ƯCLN của a = 1071 và b = 462. Đầu tiên, ta chia 1071 cho 462 thì được thương là 2 và số dư là 147:

    1071 = 2 × 462 + 147.

    Do đó, UCLN(1071,462) = UCLN(462, 147). Tiếp tục chia 462 cho 147 thì được thương bằng 3 và số dư là 21:

    462 = 3 × 147 + 21.

    Do đó, UCLN(462,147) = UCLN(147, 21). Tiếp tục chia 147 cho 21 thì được thương là 7 và số dư là 0:

    147 = 7 × 21 + 0.

    Do đó, UCLN(1071,462)=21.

    Giả mã của thuật toán này như sau:

    function gcd(a, b)
        while b ≠ 0
            t:= b
            b:= a mod b
            a:= t
        return a

    Một cách ngắn gọn, để tìm UCLN của hai số xy có thể xem trong hình sau:

    Thuật toán tìm UCLN của hai số nguyên dương 13

    Đối với chương trình viết bằng Dart, bạn có thể tham khảo code tại đây https://divin.dev/dart/2021/10/14/bai-tap-dart-15.html

    Nếu sử dụng hàm, hoặc đệ quy, mời bạn tham khảo trong bài…

    Tìm UCLN của hai số nguyên bằng phép trừ

    Tìm UCLN của hai số nguyên bằng cách phép trừ. Ở đây, chúng ta sử dụng không sử dụng phép chia mà sử dụng tính chất sau nếu ab cùng chia hết cho d thì hiệu a-b cũng chia hết cho d.

    Ví dụ, xét hai số nguyên 15 và 9 thì UCLN(15,9) = UCLN(15-9,9).

    Giả mã của thuật toán này như sau:

    function gcd(a, b)
        while a ≠ b 
            if a > b
                a:= a − b
            else
                b:= b − a
        return a

    Bạn có thể tham khảo mã nguồn tại đây https://divin.dev/dart/2021/10/14/bai-tap-dart-15.html

    Xem thêm: Thuật toán quay lui và minh họa

  • 50 bài tập lập trình Dart cơ bản

    50 bài tập lập trình Dart cơ bản

    50 bài tập lập trình Dart cơ bản

    50 bài tập lập trình Dart cơ bản dưới đây được chúng tôi gợi ý giải bằng ngôn ngữ Dart. Tuy nhiên, bạn hoàn toàn có thể sử dụng Python, C, C#, C++, Java hoặc các ngôn ngữ lập trình khác để giải quyết. Do đó chúng tôi tổng hợp chung lại thành một bài viết. Phần lời giải, nếu có, của từng ngôn ngữ sẽ có bài viết riêng.

    Xem thêm: Giáo trình tự học Flutter/Dart

    Playlist dạy lập trình Dart:

    1. Bài tập lập trình Dart, C, Java cơ bản sử dụng if for while

    Các bài tập này sử dụng các câu lệnh điều kiện if, câu lệnh rẽ nhánh for, while (câu lệnh điều khiển luồng chương trình).

    Bài 1. Viết chương trình hỏi người dùng họ tên và tuổi (là một số nguyên). Tính và in ra màn hình còn bao nhiêu năm nữa thì người đó mừng thọ 100 tuổi 🙂

    Xem thêm: Cách đọc input từ người dùng tại https://www.youtube.com/watch?v=UH9Hs1wiIqM

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-1.html

    Bài 2. Viết chương trình hỏi người dùng nhập vào một số nguyên. In ra màn hình số nguyên đó là số chẵn hay lẻ.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-2.html

    Bài 3. In ra màn hình tất cả các số nguyên dương lẻ nhỏ hơn 100.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-3.html

    Bài 4. Viết chương trình in ra tất cả các số lẻ nhỏ hơn 100 trừ các số 5, 7, 93.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-4.html

    Bài 5. Viết chương trình tìm số lớn nhất trong ba số thực a, b, c.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-5.html

    Bài 6. Viết chương trình kiểm tra xem hai số thực a b cho trước có cùng dấu hay không.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-6.html

    Bài 7. Viết chương trình in ra cách đọc của một số nguyên n cho trước có ba chữ số. Ví dụ với n=123 thì kết quả in ra màn hình là Một trăm hai mươi ba.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-7.html

    Bài 8. Viết chương trình sinh ra một số tự nhiên n ngẫu nhiên từ 1 đến 100. Đề nghị người dùng đoán một số và nhập vào. In ra màn hình thông báo xem số người dùng đoán đúng, lớn hơn hay nhỏ hơn số n. Nếu chưa đúng thì cho phép người dùng đoán lại hai lần nữa.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-8.html

    Bài 9. Viết chương trình tìm tất cả các số chia hết cho 7 nhưng không phải bội số của 5, nằm trong đoạn 10200. Các số thu được sẽ được in thành chuỗi trên một dòng, cách nhau bằng dấu phẩy.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-9.html

    Bài 10. Viết chương trình nhập ngày, tháng, năm. Hãy cho biết tháng đó có bao nhiêu ngày.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-10.html

    Bài 11. Viết chương trình nhập ngày, tháng, năm. Hãy cho biết ngày đó là thứ mấy.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-11.html

    Bài 12. Viết chương trình in bảng cửu chương ra màn hình.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-12.html

    Bài 13. Hãy sử dụng vòng lặp for để in tất cả các ký tự A tới Z ra màn hình.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-13.html

    Bài 14. Viết một chương trình tính giai thừa của một số nguyên dương n. Với n được nhập từ bàn phím. Ví dụ, n = 8 thì kết quả đầu ra phải là

    1*2*3*4*5*6*7*8 = 40320

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-14.html

    Bài 15. Viết chương trình tìm ước số chung lớn nhất (UCLN) của hai số nguyên dương ab nhập từ bàn phím.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-15.html

    Bài 16. Viết chương trình tìm bội số chung nhỏ nhất (BCNN) của hai số nguyên dương ab nhập từ bàn phím.

    Bài 17. Viết chương trình kiểm tra một số nguyên dương n có phải là số nguyên tố hay không.

    Lời giải: https://divin.dev/dart/2021/10/14/bai-tap-dart-17.html

    Bài 18. Viết chương trình liệt kê n số nguyên tố đầu tiên. Số nguyên dương n được nhập từ bàn phím.

    Hướng dẫn. Bạn có thể tham khảo về sàng số nguyên tố

    Bài 19. Tìm số nguyên dương n nhỏ nhất sao cho 1 + 2 + … + n > 10000.

    Lời giải: Bài tập Dart số 19

    Bài 20. Viết chương trình liệt kê n số hạng đầu tiên của dãy Fibonacci không sử dụng hàm.

    Hướng dẫn. Nếu sử dụng hàm và lời gọi đệ qui thì bài toán khá đơn giản, xin mời xem lời giải ở bài 54. Ở đây, chúng ta sẽ sử dụng ba biến để luôn phiên thay đổi các số hạng của dãy Fibonacci và một biến đếm. 

    Lời giải: Bài tập Dart số 20-Dãy Fibonacci

    Bài 21. Viết chương trình tính tổng các giá trị lẻ nguyên dương nhỏ hơn số nguyên dương n cho trước.

    Bài 22. Viết chương trình tìm số nguyên dương m lớn nhất sao cho 1 + 2 + 3 + … + m < N.

    Bài 23. Viết chương trình liệt kê tất cả số nguyên tố có 5 chữ số.

    Bài 24. Viết chương trình phân tích số nguyên n thành các thừa số nguyên tố. Ví dụ: 100 = 2*2*5*5.

    Bài 25. Viết chương trình tính tổng của các chữ số của môt số nguyên n trong Dart. Số nguyên dương n được nhập từ bàn phím. Với n = 1234, tổng các chữ số: 1 + 2 + 3 + 4 = 10.

    Bài 26. Viết chương trình kiểm tra một số nguyên dương n có là số thuận nghịch hay không.

    Bài 27. Viết chương trình liệt kê tất cả các số nguyên tố nhỏ hơn n. Số nguyên dương n được nhập từ bàn phím.

    Bài 28. Liệt kê tất cả ước số của số nguyên dương n.

    Bài 29. Tính tổng tất cả ước số của số nguyên dương n.

    Bài 30. Tính tích tất cả ước số của số nguyên dương n.

    Bài 31. Đếm số lượng ước số của số nguyên dương n.

    Bài 32. Liệt kê tất cả ước số lẻ của số nguyên dương n.

    Bài 33. Cho số nguyên dương n. Tính tổng các ước số nhỏ hơn chính nó.

    Bài 34. Tìm ước số lẻ lớn nhất của số nguyên dương n. Ví dụ n = 100 ước lẻ lớn nhất của 10025.

    Bài 35. Cho số nguyên dương n. Kiểm tra số dương n có phải là số hoàn thiện (số hoàn hảo) hay không.

    Bài 36. Cho số nguyên dương n. Kiểm tra số nguyên dương n có phải là số nguyên tố hay không.

    Bài 37. Cho số nguyên dương n. Kiểm tra số nguyên dương n có phải là sốchính phương hay không.

    Bài 38. Cho n là số nguyên dương. Hãy tìm giá trị nguyên dương k lớn nhất sao cho S(k) < n. Trong đó chuỗi S(k) được định nghĩa như sau:

    S(k) = 1 + 2 + 3 + … + k

    Bài 39. Hãy đếm số lượng chữ số của số nguyên dương n.

    Bài 40. Hãy tính tổng các chữ số của số nguyên dương n.

    Bài 41. Hãy tìm chữ số đảo ngược của số nguyên dương n.

    Bài 42. Tìm chữ số nhỏ nhất của số nguyên dương n.

    Bài 43. Hãy kiểm tra số nguyên dương n có toàn chữ số lẻ hay không.

    Bài 44. Hãy kiểm tra các chữ số của số nguyên dương n có tăng dần từ trái sang phải hay không.

    Bài 45. Hãy kiểm tra các chữ số của số nguyên dương n có giảm dần từ trái sang phải hay không.

    Bài 46. Giải phương trình bậc nhất ax+b=0.

    Bài 47. Giải phương trình bậc hai ax^2+bx+c=0.

    Bài 48. Giải phương trình trùng phương ax^4+bx^2+c=0.

    Bài 49. Viết chương trình nhập 3 cạnh của một tam giác là các số nguyên dương. Hãy cho biết đó là tam giác gì.

    Bài 50. Lập chương trình giải hệ: $$\begin{cases} ax+by=c\\ dx+ey=f \end{cases}$$ Các hệ số a b c d e f nhập từ bàn phím. Yêu cầu xét tất cả các trường hợp có thể. (Gợi ý: Sử dụng định thức)

    2. Bài tập lập trình Dart, C, Java cơ bản sử dụng hàm

    Bài 51. Cần có tổng 200.000đ từ 3 loại tiền 1000đ, 2000đ, và 5000đ. Lập chương tình để tìm tất cả các phương án có thể.Tìm giá trị lớn nhất trong mảng một chiều các số thực.

    Bài 52. Viết chương trình tính tổng các số tự nhiên từ 1 tới n.

    Bài 53. Viết chương trình tính giai thừa của số tự nhiên n.

    Bài 54. Viết hàm tính số hạng thứ n của dãy Fibonacci.

    Bài 55. Viết hàm kiểm tra xem số nguyên dương n có là số nguyên tố hay không.

    Bài 56. Viết hàm tìm UCLN của hai số nguyên ab sử dụng đệ quy.