30/09/2018, 18:39
Tìm dãy con tăng dần dài nhất trong chuỗi?
Bài này đã suy nghĩ 2 - 3 ngày nhưng vẫn không tìm ra được thuật toán để giải quyết nó, viết in ra dãy tăng dần thì nó toàn thiếu 1 số, , mong mọi người cho em một chút giải thuật để em giải quyết nó. Chỉ cần giải thuật để em tự làm, không cần code.Thanks trước nha!!!
#include <iostream>
#include <cstring>
using namespace std;
main()
{
char s[] = "75367985789";
//VD o day no phai in ra la: 3679, 5789
int i , j , m;
m = s[0];
for(i = 0; i <= strlen(s); i++)
{
if(m < s[i])
{
cout << s[i];
m = s[i];
}
else
m = s[i];
cout << endl;
}
}
Bài liên quan
Tư tưởng: Thuật toán cần là
quy hoạch động
Với mỗis[i]
cần tìm dãy con tăng dài nhất kết thúc tại đó.Giả sử đang dừng tại
i
để thõa mãn dãy con tăng dài nhất kết thúc tạii
ta xét tất cả các phần tử đứng trước mà nhỏ hơn. rồi từ đó tìm dãy con dài nhấtĐể sử dụng thuật toán cần 2 mảng
max và trace
dùng để lưu kết quả tốt nhất tạii
và phần tử trước đóMÌnh sẽ làm ví dụ với chuỗi
"7536798"
Kết quả cuối cùng dãy tăng dài nhất là tìm G TLN của dãy
max
tạii =5
``
Bầy giờ ta tìm đó là chuỗi ntn? Đặt chuỗi kq là w=’’
w+=s[5] = “9”
tại i=5 trace[5]=4 : w+=s[4]= “97”
tai i=4 trace[4] =3: w+=s[3]=“976”
tai i=3 trace[3]=1 w+=s[1]=“9765”
tai i=1 trace[1]=-1 ket thuc
kết quả là đảo ngược chuỗi rev(w) = “5679”
Ở i = 3 tại sao lại chon 5 vậy? và số đầu là sao vậy anh?
Cái này là cách tìm gtln thôi. Nếu for từ đầu=> cuối thì chọn 5, còn ngược lại sẽ chọn 3. Có ý nghĩa cho cách chọn là nếu có nhiều dãy con tăng cùng độ dài. For 1 sẽ cho kq đầu tiên dài nhất. For thứ 2 sẽ cho kq cuối cùng
Cứ mỗi lần có số lớn hơn thì thay đỗi Max, nhưng còn trace nó thay đổi ntn vậy a?
Bạn có thể sửa lại thành :
> #include
Cách dễ hiểu nhất là sử dụng
std::list<string>
rồi tách chuỗi ban đầu thành các chuỗi con cho vào trong list. Chuỗi nào dài bằng chuỗi dài nhất thì in ra