| | Thuật toán qui hoạch động (Dynamic programing) | |
| | Tác giả | Thông điệp |
---|
TrungHieu11 Admin
Tổng số bài gửi : 52 Points : 102 Danh tiếng : 6 Join date : 15/10/2011 Đến từ : Đại học Công Nghiệp Tp.HCM
| Tiêu đề: Thuật toán qui hoạch động (Dynamic programing) Sat Oct 22, 2011 10:55 pm | |
| Qui hoạch động (Dynamic programing) là 1 trong những kĩ thuật được sử dụng rất nhiều trong các problems. Qui hoạch động dựa trên kĩ thuật quay lui bằng cách xây dựng các sub-solution từ các kết quả đã tìm kiếm trước đó. Độ phức tạp tốt hơn thuật toán quay lui rất nhiều. VD 1: Nhập vào 1 số n (n <= 45) tìm số fibonacci thứ n; Giải bằng đệ qui: - Code:
-
#include <cstdio>
using namespace std; //Xay dung ham de qui tinh so fibonacci int fibonacci(int i){ if (i == 1 || i == 2) return 1; return fibonacci(i - 1) + fibonacci(i - 2); }
int main(){ int n; scanf("%d", &n); printf("%d", fibonacci(n)); } Giải bằng thuật toán qui hoạch động: - Code:
-
#include <cstdio>
using namespace std;
int main(){ int n, F[100]; //Khoi tao 2 gia tri ban dau la F[1] = 1 va F[2] = 1 F[1] = 1; F[2] = 1; for (int i = 3; i <= 50; i++) F[i] = F[i - 1] + F[i - 2];//F[i] duoc xay dung tu cac sub-solution la F[i - 1] va F[i - 2] scanf("%d", &n); printf("%d", F[n]); //Cuoi cung chi can xuat so thu F[n] la xong :D } Khi nhập n = 45 vào các bạn có thể thấy thuật toán đệ qui chạy rất lâu còn thuật toán DP chạy ra kết quả ngay. VD 2: QBMAX (VNOI – SPOJ) Đề bài: - Code:
-
Cho một bảng A kích thước m x n (1 <= m, n <= 100), trên đó ghi các số nguyên aij (|aij| <= 100). Một người xuất phát tại ô nào đó của cột 1, cần sang cột n (tại ô nào cũng được).
Quy tắc đi: Từ ô (i, j) chỉ được quyền sang một trong 3 ô (i, j + 1); (i - 1, j + 1); (i + 1, j + 1)
Input Dòng 1: Ghi hai số m, n là số hàng và số cột của bảng.
M dòng tiếp theo, dòng thứ i ghi đủ n số trên hàng i của bảng theo đúng thứ tự từ trái qua phải
Output Gồm 1 dòng duy nhất ghi tổng lớn nhất tìm được
Example Input: 5 7 9 -2 6 2 1 3 4 0 -1 6 7 1 3 3 8 -2 8 2 5 3 2 1 -1 6 2 1 6 1 7 -2 6 2 1 3 7
Output: 41 Thuật toán: Qui hoạch động Source code: - Code:
-
#include <cstdio> #include <iostream>
using namespace std;
int main(){ //Initial int n, m, A[105][105]; //Input scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) scanf("%d", &A[i][j]); //Process int dp[105][105]; for (int i = 1; i <= n; i++) dp[i][1] = A[i][1];//Khoi tao cac gia tri ban dau /*Mang dp hien tai: 9 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 1 0 0 0 0 0 0 7 0 0 0 0 0 0 */ for (int j = 2; j <= m; j++) for (int i = 1; i <= n; i++){ if (i == 1) dp[i][j] = max(dp[i][j - 1], dp[i + 1][j - 1]); else if (i == n) dp[i][j] = max(dp[i][j - 1], dp[i - 1][j - 1]); else dp[i][j] = max(dp[i][j - 1], max(dp[i + 1][j - 1], dp[i - 1][j - 1])); dp[i][j] += A[i][j]; } /*Mang dp sau khi xu li 9 7 14 16 24 27 35 0 8 14 23 24 31 34 8 9 16 18 28 31 36 1 7 13 18 19 34 35 7 5 13 15 19 22 41 */ int maxVal = -10000; for (int i = 1; i <= n; i++) maxVal = max(maxVal, dp[i][m]); printf("%d", maxVal);//Gia tri max la 41 }
/*Example test: Input: 5 7 9 -2 6 2 1 3 4 0 -1 6 7 1 3 3 8 -2 8 2 5 3 2 1 -1 6 2 1 6 1 7 -2 6 2 1 3 7
Output: 41 */ Một số bài tập khác:QBSTR LIQ LIS VCOWFLIX LATGACH NKSGAME NKTICK LNACS
Được sửa bởi TrungHieu11 ngày Sun Oct 23, 2011 1:10 pm; sửa lần 1. | |
| | | fallinlove2011 Đang tập code
Tổng số bài gửi : 18 Points : 27 Danh tiếng : 0 Join date : 16/10/2011 Age : 31 Đến từ : Đại Học Công Nghiệp
| Tiêu đề: Re: Thuật toán qui hoạch động (Dynamic programing) Sat Oct 22, 2011 11:15 pm | |
| | |
| | | TrungHieu11 Admin
Tổng số bài gửi : 52 Points : 102 Danh tiếng : 6 Join date : 15/10/2011 Đến từ : Đại học Công Nghiệp Tp.HCM
| Tiêu đề: Re: Thuật toán qui hoạch động (Dynamic programing) Sun Oct 23, 2011 1:06 pm | |
| Các bạn cần phải đọc thêm các ebook mà mình đã post lên, trong đó có đầy đủ cả. Năm rùi mình cũng chỉ học trong các ebook và wikipedia (năm nay chuyển sang youtube nữa ). Có thắc mắc gì các bạn cứ post lên rùi cùng thảo luận. Về việc code bài thì bắt đầu từ tuần sau mình sẽ post những bài của mình đã code lên nhưng là những bài trong codeforces (vì mình đang luyện trên codeforces mà ). | |
| | | lovestorm_6390 Đang tập code
Tổng số bài gửi : 5 Points : 7 Danh tiếng : 0 Join date : 17/10/2011
| Tiêu đề: Re: Thuật toán qui hoạch động (Dynamic programing) Sun Oct 23, 2011 10:52 pm | |
| uhm cảm ơn anh nhiều nha.hi vọng qua khi luyện code nhiều em sẽ nâng cao dc kĩ thuật lập trình e thấy đôi lúc thuật toán thì mình biết mà kĩ thuật code còn tệ quá | |
| | | TrungHieu11 Admin
Tổng số bài gửi : 52 Points : 102 Danh tiếng : 6 Join date : 15/10/2011 Đến từ : Đại học Công Nghiệp Tp.HCM
| Tiêu đề: Re: Thuật toán qui hoạch động (Dynamic programing) Sun Oct 23, 2011 11:20 pm | |
| - lovestorm_6390 đã viết:
- uhm cảm ơn anh nhiều nha.hi vọng qua khi luyện code nhiều em sẽ nâng cao dc kĩ thuật lập trình e thấy đôi lúc thuật toán thì mình biết mà kĩ thuật code còn tệ quá
Không phải hy vọng mà là chắc chắn. "C#, Java, Php ai cũng có thể học trong vài tháng còn giải thuật thì không phải ai cũng học được" (trích lời của thầy Ngọc) nên nếu em giỏi giải thuật chắc chắn code cũng sẽ giỏi => học các ngôn ngữ khác chỉ là chuyện nhỏ | |
| | | letrongngoc Đang tập code
Tổng số bài gửi : 2 Points : 2 Danh tiếng : 0 Join date : 16/10/2011
| Tiêu đề: Một câu hỏi tuyển dụng Thu Dec 01, 2011 2:56 pm | |
| An, Bình, Chung, Dung phải qua cầu khỉ vào buổi tối. Chỉ có một cái đèn pin. Tối đa là hai người đi cùng một lúc, và phải có đèn mới qua/lại được. Họ đi với tốc độ khác nhau. Nếu hai người cùng đi thì cả hai phải đi bằng tốc độ người đi chậm hơn. An cần 1 phút. Bình cần 2 phút. Chung cần 5 phút. Dung cần 10 phút. Dĩ nhiên là phải có người cầm đèn đi ngược lại để đón người kế qua nếu cần! Hỏi: ít nhất họ cần bao nhiêu phút để cả 4 qua được cầu?
Thêm : sau khi trả lời xong, giải quyết bài toán một cách tổng quát bằng 2 cách : quy hoạch động và greedy | |
| | | fallinlove2011 Đang tập code
Tổng số bài gửi : 18 Points : 27 Danh tiếng : 0 Join date : 16/10/2011 Age : 31 Đến từ : Đại Học Công Nghiệp
| Tiêu đề: Re: Thuật toán qui hoạch động (Dynamic programing) Fri Dec 02, 2011 12:50 am | |
| Lời giải: 2 người đi chung mà phụ thuộc vào tốc độ người đi chậm thì ta chọn ra người đi nhanh nhất để khi cầm đèn trở về là tối ưu nhất. Vì thế lượt đi sẽ là: An + Dung -> đi 10p và An về 1p; An + Chung -> đi 5p và An về 1p; An + Bình -> đi 2p. ==> Tổng là 19p. Ta thấy số lần đi của An là 2 lần = n - 2 và những người khác mỗi người đi một lần nên Tổng là : Dung + Chung + Bình + An * 2. Do em coi quy hoạch động và tham lam chưa rõ nên em làm theo cách của mình, nếu có gì sai sót thì xin thầy và các anh góp ý dùm. - Code:
-
#include <iostream> using namespace std; int main() { int n,BT = 0,bt[100]; cout << "Nhap so nguoi:"; cin >> n; cout << "Nhap thoi gian tung nguoi:\n"; for (int i = 0;i < n;i++) cin >> bt[i]; int min = bt[0]; for (int i = 0;i < n;i++) if (bt[i] > bt[i + 1]) min = bt[i + 1]; for (int i = 0;i < n;i++) if (bt[i] != min) BT += bt[i]; else BT += min * (n - 2); cout << "KQ: " << BT << "\n"; }
| |
| | | letrongngoc Đang tập code
Tổng số bài gửi : 2 Points : 2 Danh tiếng : 0 Join date : 16/10/2011
| Tiêu đề: Re: Thuật toán qui hoạch động (Dynamic programing) Sun Dec 04, 2011 6:21 pm | |
| | |
| | | Sponsored content
| Tiêu đề: Re: Thuật toán qui hoạch động (Dynamic programing) | |
| |
| | | | Thuật toán qui hoạch động (Dynamic programing) | |
|
Trang 1 trong tổng số 1 trang | |
Similar topics | |
|
| Permissions in this forum: | Bạn không có quyền trả lời bài viết
| |
| |
| |