Lập Trình Viên Gà
Senior Member
Vào trong này toàn quái vật IQ cao, sợ vc
nó nhanh hơn lúc search thôi, còn lúc build cái trie thì lại chậm hơn rất rất nhiều. VD 1 chuỗi có length là 1000 thì nó phải insert 1000 lần chuỗi có độ dài từ 1002 đến 2001. Trong khi cách dùng 2 trie chỉ cần insert duy nhất 2 lần: chuỗi ban đầu và đảo ngược của nó.Oh dĩ nhiên nhanh hơn thì phải tốn mem hơn rồi. Mà thường thì người ta chú trọng thời gian hơn memo.
Sent from Samsung SM-A528B using vozFApp

Bài này bác dùng backtracking là raliệt kê tất cả số có 3 chữ số tạo bởi 2 số a hoặc b hoặc cả 2 trong ma trận
nếu giải tay thì ta biết dc có 2^3=8 số thỏa mãn,aaa,aab,aba,......,bbb
ví dụ
input:1,2
output:
[
[1, 1, 1]
[1, 1, 2]
[1, 2, 1]
.....
.....
.....
[2, 2, 2]
]
giúp em với![]()

liệt kê tất cả số có 3 chữ số tạo bởi 2 số a hoặc b hoặc cả 2 trong ma trận
nếu giải tay thì ta biết dc có 2^3=8 số thỏa mãn,aaa,aab,aba,......,bbb
ví dụ
input:1,2
output:
[
[1, 1, 1]
[1, 1, 2]
[1, 2, 1]
.....
.....
.....
[2, 2, 2]
]
giúp em với![]()
def func(a, b):
ret = [[]]
for i in range(0,3):
ret = [[a] + x for x in ret] + [[b] + x for x in ret]
return ret
print(func(1,2))

a, b có ràng buộc từ 0 - 9 không thế?liệt kê tất cả số có 3 chữ số tạo bởi 2 số a hoặc b hoặc cả 2 trong ma trận
nếu giải tay thì ta biết dc có 2^3=8 số thỏa mãn,aaa,aab,aba,......,bbb
ví dụ
input:1,2
output:
[
[1, 1, 1]
[1, 1, 2]
[1, 2, 1]
.....
.....
.....
[2, 2, 2]
]
giúp em với![]()

Dùng BFS cho nó dễ hình dung, backtrack đau đầu lắmliệt kê tất cả số có 3 chữ số tạo bởi 2 số a hoặc b hoặc cả 2 trong ma trận
nếu giải tay thì ta biết dc có 2^3=8 số thỏa mãn,aaa,aab,aba,......,bbb
ví dụ
input:1,2
output:
[
[1, 1, 1]
[1, 1, 2]
[1, 2, 1]
.....
.....
.....
[2, 2, 2]
]
giúp em với![]()
queue<string>q;
q.push("1");
q.push("2");
vector<string>res;
while(!q.empty()){
string z=q.front();
q.pop();
if(z.size()==3){
res.push_back(z);
continue;
}
q.push(z+"1");
q.push(z+"2");
}
for(auto x:res) cout<<x<<" ";
liệt kê tất cả số có 3 chữ số tạo bởi 2 số a hoặc b hoặc cả 2 trong ma trận
nếu giải tay thì ta biết dc có 2^3=8 số thỏa mãn,aaa,aab,aba,......,bbb
ví dụ
input:1,2
output:
[
[1, 1, 1]
[1, 1, 2]
[1, 2, 1]
.....
.....
.....
[2, 2, 2]
]
giúp em với![]()
Thuật toán Floyde Bellman cơ bản thôi. Không nhớ viết đúng ko. Hoặc tra trên vnoi các thuật toán đường đi ngắn nhất là raXem tệp đính kèm 1505065
các bác giúp e bài này với ạ
ý bác là tìm đường đi ngắn nhất rồi chọn min đúng kh ạ, có thuật nào tối ưu hơn không ạThuật toán Floyde Bellman cơ bản thôi. Không nhớ viết đúng ko. Hoặc tra trên vnoi các thuật toán đường đi ngắn nhất là ra
Mỗi lần tìm xong đường đi ngắn nhất từ 1 đỉnh v tới đích t thì bác lưu tất cả các đỉnh trên đường đi từ v tới t (kèm khoảng cách) lại.ý bác là tìm đường đi ngắn nhất rồi chọn min đúng kh ạ, có thuật nào tối ưu hơn không ạ
H đọc lại đề thì thấy cần 3 đỉnh thôi thì dùng djstra thôi.ý bác là tìm đường đi ngắn nhất rồi chọn min đúng kh ạ, có thuật nào tối ưu hơn không ạ
K cần đâu làm vậy đâu, suy nghĩ ngược lại thay vì tìm đường đi ngắn nhất từ tất cả các đỉnh đến t thì từ t đi ngược lại 3 đỉnh bằng djstra ấy. 3 đỉnh reachable đầu tiên là 3 đỉnh có đường đi ngắn nhất đến t.Mỗi lần tìm xong đường đi ngắn nhất từ 1 đỉnh v tới đích t thì bác lưu tất cả các đỉnh trên đường đi từ v tới t (kèm khoảng cách) lại.
Sau đó ko cần xét lại các đỉnh đã lưu nữa hoặc sử dụng đỉnh đã cache từ trước để tính toán cho đỉnh mới thay vì đi lại.
Sửa Dijkstra lại 1 chút là được
K cần đâu làm vậy đâu, suy nghĩ ngược lại thay vì tìm đường đi ngắn nhất từ tất cả các đỉnh đến t thì từ t đi ngược lại 3 đỉnh bằng djstra ấy. 3 đỉnh reachable đầu tiên là 3 đỉnh có đường đi ngắn nhất đến t.
reachable đầu tiên chưa chắc là ngắn nhất bác, đỉnh nào phải là được chọn để đi tiếp mới là ngắn nhất chứ ạK cần đâu làm vậy đâu, suy nghĩ ngược lại thay vì tìm đường đi ngắn nhất từ tất cả các đỉnh đến t thì từ t đi ngược lại 3 đỉnh bằng djstra ấy. 3 đỉnh reachable đầu tiên là 3 đỉnh có đường đi ngắn nhất đến t.
tức là vẫn phải tìm từ t đến N đỉnh kia xong chọn 3 thằng min đúng k ạ, quan trọng phải đảo chiều đồ thị ban đầuKhông được đâu, vì theo đề bài thì đồ thị là có hướng, đường đi ở hai chiều không nhất thiết tương đương.
--
Edited: Nếu dùng với đồ thị ngược của input thì có khi được.
Vậy thuật toán sẽ là như này:
- B1: đặt E' = <đảo chiều các cạnh của E>
- B2: Chạy Dijkstra (V, E') với bắt đầu là t. Dừng khi tìm được đường đi ngắn nhất đến tất cả N điểm nguồn,
- B3: Output 3 đường đi ngắn nhất trong số N
Thanks thím. Như vậy vừa trong khi dijsktra từ t thì reverse hướng dần dần nhỉ. Cho đến khi số đỉnh đã tìm shortest path finish == 3 dừng là đcK cần đâu làm vậy đâu, suy nghĩ ngược lại thay vì tìm đường đi ngắn nhất từ tất cả các đỉnh đến t thì từ t đi ngược lại 3 đỉnh bằng djstra ấy. 3 đỉnh reachable đầu tiên là 3 đỉnh có đường đi ngắn nhất đến t.