ݺߣ

ݺߣShare a Scribd company logo
1 
Chuỗi số tăng dần lớn nhất 
- Gọi mảng ban đầu là M[] chứa các phần tử cần tìm chuỗi tăng dần lớn nhất trong mảng 
- Khởi tạo 2 mảng: rỗng 
+ Mảng chiso[] chứa chỉ số của các số tăng dần lớn nhất trong mảng M 
+ Mảng giatri[] chứa các phần tử của chuỗi tăng dần lớn nhất trong mảng M 
- Cho chỉ số i chạy từ đầu đến cuối mảng M 
+ Nếu mảng giatri rỗng hoặc M[i] lớn hơn hoặc bằng giá trị cuối cùng của mảng giatri thì thêm: M[i] vào cuối cùng của mảng giatri, thêm chỉ số i vào cuối cùng của mảng chiso. 
+ Ngược lại: nếu M[i] nhỏ hơn phần tử cuối cùng của mảng giatri thì: tìm phần tử nhỏ nhất trong các phần tử lớn hơn hoặc bằng M[i](tìm các phần tử lớn hơn hoặc bằng M[i] trong mảng giatri, sau đó lấy phần tử nhỏ nhất). 
- Duyệt lại mảng chiso tìm chuỗi tăng dần lớn nhất: 
+ Cho i chạy từ vị trí cuối về đầu tìm những vị trí chỉ số không đúng: mảng chỉ số đúng của dãy tăng đần lớn nhất là giảm dần từ cuối về đầu 
i = số phần tử của mảng chiso – 1; 
while(i > 0) 
{ 
if(chiso[i] < chiso[i-1]) 
{ 
+ Tìm trên mảng M chỉ số của phần tử lớn nhất trong những phần tử nhỏ hơn M[chiso[i]] trong khoảng [i; chiso[i]), thay chiso[i-1] = bằng chỉ số của phần tử tìm được. 
} 
i--; 
} 
- Ví dụ: tìm chuỗi tăng dần lớn nhất của dãy số sau: 3, 7, 5, 2, 6, 8, 1, 4, 9 
i 
0 
1 
2 
3 
4 
5 
6 
7 
8 
M 
3 
7 
5 
2 
6 
8 
1 
4 
9
2 
i = 0; M[0] = 3; 
chiso[] = {0}; 
giatri[] = {3}; 
i = 1; M[1] = 7; 
chiso[] = {0, 1}; 
giatri[] = {3, 7}; 
i = 2; M[2] = 5; 
chiso[] = {2, 1}; 
giatri[] = {5, 7}; 
i = 3; M[3] = 2; 
chiso[] = {3, 1}; 
giatri[] = {2, 7}; 
i = 4; M[4] = 6; 
chiso[] = {3, 4}; 
giatri[] = {2, 6}; 
i = 5; M[5] = 8; 
chiso[] = {3, 4, 5}; 
giatri[] = {2, 6, 8}; 
i = 6; M[6] = 1; 
chiso[] = {6, 4, 5}; 
giatri[] = {1, 6, 8}; 
i = 7; M[7] = 4; 
chiso[] = {7, 4, 5}; 
giatri[] = {4, 6, 8}; 
i = 8; M[8] = 9; 
chiso[] = {7, 4, 5, 8}; 
giatri[] = {4, 6, 8, 9}; 
+ Kết quả bước 1: 
chiso[] = {7, 4, 5, 8}; 
giatri[] = {4, 6, 8, 9}; 
+ Duyệt lại mảng chỉ số: trong mảng chỉ số ta thấy 7 không đúng thứ tự giảm dần tại chiso[0]. Từ vị trí chiso[4-1] trong khoảng (0, chiso[4-1]] ở mảng M tìm số lớn nhất trong những số nhỏ hơn M[chiso[4]] ta được số 5 tại chỉ số 2. Thay chỉ số 7 là 2 trong mảng chiso, giá trị 4 là 5 trong mảng giá trị 
 Chuỗi tăng dần lớn nhất là: 5, 6, 8 , 9 
- Code: int* LongestIncrement(int *mang, int n) { if(n < 2) return mang; int chiso[100], i_chiso, i, j; int giatri[100], i_giatri; i_chiso = 0; i_giatri = 0; //khoi tao giatri[i_giatri] = mang[0]; chiso[i_chiso] = 0; for(i = 1; i < n; i++) { if(mang[i] > giatri[i_giatri]) { i_giatri++; giatri[i_giatri] = mang[i]; i_chiso++; chiso[i_chiso] = i; } else { j = i_giatri; while(j > -1) {
3 
if(giatri[j] >= mang[i]) j--; else break; } j++; giatri[j] = mang[i]; chiso[j] = i; } } for(i = 0; i <= i_chiso; i++) cout<<chiso[i]<<" "; //duyệt tìm kết quả int *ketqua = new int[100]; int min, tam; i = i_chiso; ketqua[0] = i_chiso + 2; while(i > 0) { if(chiso[i] < chiso[i -1]) { j = chiso[i]; tam = mang[j]; while(j > 0 && tam < mang[j-1]) j--; j--; min = mang[j]; i_chiso = j; while(j > -1) { if(mang[j] < tam && min < mang[j]) { min = mang[j]; i_chiso = j; } j--; } chiso[i-1] = i_chiso; ketqua[i+1] = tam; } else ketqua[i+1] = mang[chiso[i]]; i--; } ketqua[1] = mang[chiso[0]]; return ketqua; }

More Related Content

Chuỗi số tăng dần lớn nhất

  • 1. 1 Chuỗi số tăng dần lớn nhất - Gọi mảng ban đầu là M[] chứa các phần tử cần tìm chuỗi tăng dần lớn nhất trong mảng - Khởi tạo 2 mảng: rỗng + Mảng chiso[] chứa chỉ số của các số tăng dần lớn nhất trong mảng M + Mảng giatri[] chứa các phần tử của chuỗi tăng dần lớn nhất trong mảng M - Cho chỉ số i chạy từ đầu đến cuối mảng M + Nếu mảng giatri rỗng hoặc M[i] lớn hơn hoặc bằng giá trị cuối cùng của mảng giatri thì thêm: M[i] vào cuối cùng của mảng giatri, thêm chỉ số i vào cuối cùng của mảng chiso. + Ngược lại: nếu M[i] nhỏ hơn phần tử cuối cùng của mảng giatri thì: tìm phần tử nhỏ nhất trong các phần tử lớn hơn hoặc bằng M[i](tìm các phần tử lớn hơn hoặc bằng M[i] trong mảng giatri, sau đó lấy phần tử nhỏ nhất). - Duyệt lại mảng chiso tìm chuỗi tăng dần lớn nhất: + Cho i chạy từ vị trí cuối về đầu tìm những vị trí chỉ số không đúng: mảng chỉ số đúng của dãy tăng đần lớn nhất là giảm dần từ cuối về đầu i = số phần tử của mảng chiso – 1; while(i > 0) { if(chiso[i] < chiso[i-1]) { + Tìm trên mảng M chỉ số của phần tử lớn nhất trong những phần tử nhỏ hơn M[chiso[i]] trong khoảng [i; chiso[i]), thay chiso[i-1] = bằng chỉ số của phần tử tìm được. } i--; } - Ví dụ: tìm chuỗi tăng dần lớn nhất của dãy số sau: 3, 7, 5, 2, 6, 8, 1, 4, 9 i 0 1 2 3 4 5 6 7 8 M 3 7 5 2 6 8 1 4 9
  • 2. 2 i = 0; M[0] = 3; chiso[] = {0}; giatri[] = {3}; i = 1; M[1] = 7; chiso[] = {0, 1}; giatri[] = {3, 7}; i = 2; M[2] = 5; chiso[] = {2, 1}; giatri[] = {5, 7}; i = 3; M[3] = 2; chiso[] = {3, 1}; giatri[] = {2, 7}; i = 4; M[4] = 6; chiso[] = {3, 4}; giatri[] = {2, 6}; i = 5; M[5] = 8; chiso[] = {3, 4, 5}; giatri[] = {2, 6, 8}; i = 6; M[6] = 1; chiso[] = {6, 4, 5}; giatri[] = {1, 6, 8}; i = 7; M[7] = 4; chiso[] = {7, 4, 5}; giatri[] = {4, 6, 8}; i = 8; M[8] = 9; chiso[] = {7, 4, 5, 8}; giatri[] = {4, 6, 8, 9}; + Kết quả bước 1: chiso[] = {7, 4, 5, 8}; giatri[] = {4, 6, 8, 9}; + Duyệt lại mảng chỉ số: trong mảng chỉ số ta thấy 7 không đúng thứ tự giảm dần tại chiso[0]. Từ vị trí chiso[4-1] trong khoảng (0, chiso[4-1]] ở mảng M tìm số lớn nhất trong những số nhỏ hơn M[chiso[4]] ta được số 5 tại chỉ số 2. Thay chỉ số 7 là 2 trong mảng chiso, giá trị 4 là 5 trong mảng giá trị  Chuỗi tăng dần lớn nhất là: 5, 6, 8 , 9 - Code: int* LongestIncrement(int *mang, int n) { if(n < 2) return mang; int chiso[100], i_chiso, i, j; int giatri[100], i_giatri; i_chiso = 0; i_giatri = 0; //khoi tao giatri[i_giatri] = mang[0]; chiso[i_chiso] = 0; for(i = 1; i < n; i++) { if(mang[i] > giatri[i_giatri]) { i_giatri++; giatri[i_giatri] = mang[i]; i_chiso++; chiso[i_chiso] = i; } else { j = i_giatri; while(j > -1) {
  • 3. 3 if(giatri[j] >= mang[i]) j--; else break; } j++; giatri[j] = mang[i]; chiso[j] = i; } } for(i = 0; i <= i_chiso; i++) cout<<chiso[i]<<" "; //duyệt tìm kết quả int *ketqua = new int[100]; int min, tam; i = i_chiso; ketqua[0] = i_chiso + 2; while(i > 0) { if(chiso[i] < chiso[i -1]) { j = chiso[i]; tam = mang[j]; while(j > 0 && tam < mang[j-1]) j--; j--; min = mang[j]; i_chiso = j; while(j > -1) { if(mang[j] < tam && min < mang[j]) { min = mang[j]; i_chiso = j; } j--; } chiso[i-1] = i_chiso; ketqua[i+1] = tam; } else ketqua[i+1] = mang[chiso[i]]; i--; } ketqua[1] = mang[chiso[0]]; return ketqua; }