canh en buon
Youtube Master Race
- 20/5/07
- 84
- 1
- Thread starter
- #101
Cuối cùng cũng thi xong:hug: (mặc dù hy sinh gần 1 nữa::( )
Thôi kệ rớt thì hè này cày tiếp...
Buồn quá, bài post lên mấy ngày mà không ai giải ra.
Chắc tại diễn đàn dành cho gamer nên không ai quan tâm lắm đến lập trình
(bài này mình post bên www.ddth.com thì nhận được rất nhiều cách giải.
Nhưng cũng an ủi là bạn @Gaique9x đã gửi mail bài giải cho mình.
Bạn @Gaique9x có ý tưởng rất độc đáo, nhưng rất tiếc cách giải của bạn không cho ra đáp án tối ưu.
Trong bài này có 1 cách giải rất hay (sử dung qui hoặch động):
Đầu tiên ta qui hoặch lại cái ma trận theo qui tắc:
+ Giữ nguyên cột đầu tiên (cột 1).
+ Các cột tiếp theo (cột n), tại mổi phần tử ta cộng thêm 1 phần tử kề nó bé nhất trong cột trước đó (cột n-1)
Ví dụ:
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
cột đầu tiên giữ nguyên
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
phần tử đầu tiên của cột 2 có 2 phần tử kề nó.
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
ta chọn phận tử 5 là phần tử nhỏ nhất trong các phần tử kề nó
5 7 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
Cộng nó vào
5 7 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
phần tử thứ 2 trong cột 2 ta có 3 phần tử kề nó, ta tiếp tục làm tương tự như trên
5 7 9 2 9 0
6 3 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
Cứ thế ta qui hoặch xong cột 2.
5 7 9 2 9 0
6 3 2 9 7 1
1 5 2 1 2 5
8 4 8 0 1 0
Tiếp theo cột 3 ta làm tương tự cột 2
5 7 9 2 9 0
6 3 2 9 7 1
1 5 2 1 2 5
8 4 8 0 1 0
5 7 9 2 9 0
6 3 2 9 7 1
1 5 2 1 2 5
8 4 8 0 1 0
5 7 12 2 9 0
6 3 2 9 7 1
1 5 2 1 2 5
8 4 8 0 1 0
5 7 12 2 9 0
6 3 05 9 7 1
1 5 05 1 2 5
8 4 12 0 1 0
Các cột còn lại tương tự, cuối cùng ta có:
5 7 12 07 16 13
6 3 05 14 13 8
1 5 05 06 07 11
8 4 12 05 06 6
Trong cột cuối cùng ta chọn phần tử nhỏ nhất, đó chính là giá trị của đường đi ngắn nhất
5 7 12 07 16 13
6 3 05 14 13 8
1 5 05 06 07 11
8 4 12 05 06 6
ánh xạ vào bảng cũ ta có
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
Cuối cùng ta chỉ việc truy hồi lại các phần tử kề nó bé nhất là ta đã tìm xong đường đi ngắn nhất.
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
kề nó có 2 phần tử
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
???--> lấy phần tử bé nhất
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
tương tự ta có
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
Nếu cải tiến giải thuật này 1 chút cho phép ta mở rộng bài toán ra, bằng cách cho các phần tử có thể đi nhiều hơn N bước (nhưng không được đi lùi)
Ví dụ:
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 7 0 1 1 0
4 2 7 0 0 0
Thôi kệ rớt thì hè này cày tiếp...
Thích thì chiều
Đề bài: Hãy tìm đường đi qua 1 ma trận sao cho tổng các số trên đường đi là nhỏ nhất.
Ví dụ: ma trận MxN
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
Tổng các số đã đi qua là 6
Buồn quá, bài post lên mấy ngày mà không ai giải ra.
Chắc tại diễn đàn dành cho gamer nên không ai quan tâm lắm đến lập trình
(bài này mình post bên www.ddth.com thì nhận được rất nhiều cách giải.
Nhưng cũng an ủi là bạn @Gaique9x đã gửi mail bài giải cho mình.
Sử dụng giải thuật tham lam
Ý tưởng: con đường ngắn nhất trong các con đường ngắn nhất là con đường ngắn nhất
...
Bạn @Gaique9x có ý tưởng rất độc đáo, nhưng rất tiếc cách giải của bạn không cho ra đáp án tối ưu.
Trong bài này có 1 cách giải rất hay (sử dung qui hoặch động):
Đầu tiên ta qui hoặch lại cái ma trận theo qui tắc:
+ Giữ nguyên cột đầu tiên (cột 1).
+ Các cột tiếp theo (cột n), tại mổi phần tử ta cộng thêm 1 phần tử kề nó bé nhất trong cột trước đó (cột n-1)
Ví dụ:
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
cột đầu tiên giữ nguyên
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
phần tử đầu tiên của cột 2 có 2 phần tử kề nó.
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
ta chọn phận tử 5 là phần tử nhỏ nhất trong các phần tử kề nó
5 7 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
Cộng nó vào
5 7 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
phần tử thứ 2 trong cột 2 ta có 3 phần tử kề nó, ta tiếp tục làm tương tự như trên
5 7 9 2 9 0
6 3 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
Cứ thế ta qui hoặch xong cột 2.
5 7 9 2 9 0
6 3 2 9 7 1
1 5 2 1 2 5
8 4 8 0 1 0
Tiếp theo cột 3 ta làm tương tự cột 2
5 7 9 2 9 0
6 3 2 9 7 1
1 5 2 1 2 5
8 4 8 0 1 0
5 7 9 2 9 0
6 3 2 9 7 1
1 5 2 1 2 5
8 4 8 0 1 0
5 7 12 2 9 0
6 3 2 9 7 1
1 5 2 1 2 5
8 4 8 0 1 0
5 7 12 2 9 0
6 3 05 9 7 1
1 5 05 1 2 5
8 4 12 0 1 0
Các cột còn lại tương tự, cuối cùng ta có:
5 7 12 07 16 13
6 3 05 14 13 8
1 5 05 06 07 11
8 4 12 05 06 6
Trong cột cuối cùng ta chọn phần tử nhỏ nhất, đó chính là giá trị của đường đi ngắn nhất
5 7 12 07 16 13
6 3 05 14 13 8
1 5 05 06 07 11
8 4 12 05 06 6
ánh xạ vào bảng cũ ta có
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
Cuối cùng ta chỉ việc truy hồi lại các phần tử kề nó bé nhất là ta đã tìm xong đường đi ngắn nhất.
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
kề nó có 2 phần tử
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
???--> lấy phần tử bé nhất
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
tương tự ta có
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 3 8 0 1 0
Nếu cải tiến giải thuật này 1 chút cho phép ta mở rộng bài toán ra, bằng cách cho các phần tử có thể đi nhiều hơn N bước (nhưng không được đi lùi)
Ví dụ:
5 2 9 2 9 0
6 2 2 9 7 1
1 4 2 1 2 5
8 7 0 1 1 0
4 2 7 0 0 0

)