Ôn tập thi học sinh giỏi quốc gia môn Toán - Tin 2010: Dãy con chung không liền kề dài nhất
Số trang: 72
Loại file: pdf
Dung lượng: 521.91 KB
Lượt xem: 8
Lượt tải: 0
Xem trước 8 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Hãy tham khảo tài liệu ôn tập thi học sinh giỏi môn Toán - Tin năm 2010: Dãy con chung không liền kề dài nhất sẽ giúp các bạn học sinh có thêm tư liệu chuẩn bị ôn luyện và bổ trợ kiến thức cho kỳ thi sắp tới cũng như bổ trợ kiến thức cho giáo viên ra đề thi. Mời các bạn học sinh và quý thầy cô giáo cùng tham khảo.
Nội dung trích xuất từ tài liệu:
Ôn tập thi học sinh giỏi quốc gia môn Toán - Tin 2010: Dãy con chung không liền kề dài nhấtThi HSG Quốc gia 2010CCKLK: Dãy con chung không liền kề dài nhấtCho dãy số nguyên dương x = (x1, x2, ..., xn). Dãy y = (xi1, xi2, ..., xik) được gọi là dãy con không liền kề củadãy x nếu 1 i1 < i21 < ... < ik1 n. Cho 2 dãy số nguyên a gồm n phần tử và b gồm m phần tử. Xácđịnh chiều dài k của dãy con chung không liền kề dài nhất của a và b. 2 m, n 1000, 1 ai, bi 10000.CCKLK.INP CCKLK.OUT Giải thích5 6 2 CCKLK.INP: Dòng đầu: n m. Từ dòng thứ hai trở đi: Dãy số a,1 5 3 8 2 tiếp đến là dãy số b.2 1 3 4 2 6 CCKLK.OUT: k.Thuật toánQuy hoạch động.Gọi d(i,j) là đáp số của bài toán khi xét hai dãy a[1..i] và b[1..j]. Ta có: Nếu i ≤ 0 thì ta quy ước d(i,j) = 0, Nếu a[i] = b[j] thì d(i,j) = d(i−2,j−2), Nếu a[i] ≠ b[j] thì d(i,j) = max { d(i−1,j), d(i,j−1) }.Để cài đặt ta dùng 3 mảng một chiều x, y và z với ý nghĩa x[j] = d(i−2,j), y[j] = d(i−1,j) và z[j] = d(i,j). Khiđó hệ thức trên được viết là: Nếu i ≤ 0 thì ta quy ước d(i,j) = 0, Nếu a[i] = b[j] thì d(i,j) = d(i−2,j−2) ứng với z[j] = x[j−2], Nếu a[i] ≠ b[j] thì d(i,j) = max { d(i−1,j), d(i,j−1) } ứng với z[j] = max { y[j], z[j−1] }.Muốn tránh các phép copy dữ liệu từ y sang x; từ z sang y và từ x sang z ta chỉ cần tráo đổi các con trỏmảng.Độ phức tạpO(n.m)Chương trình Pascal (* CCKLK.PAS k: chieu dai day con chung khong lien ke dai nhat cua hai day so nguyen duong a[1..n], b[1..m] *) const fn = ccklk.inp; gn = ccklk.out; bl = #32; nl = #13#10; mn = 1001; type int = integer; mi1 = array[0..mn] of int; var n, m: int; a, b: mi1; function Max(a,b: int): int; begin if a >= b then Max := a else Max := b; end; procedure Doc; var i: int; f: text; begin assign(f,fn); reset(f); read(f,n, m); writeln(n,bl,m); for i := 1 to n do read(f,a[i]); for i := 1 to m do read(f,b[i]); write(nl, a: ); for i := 1 to n do write(a[i],bl); write(nl, b: ); for i := 1 to n do write(b[i],bl); close(f);end;procedure Ghi(k: int); var g: text; begin assign(g,gn); rewrite(g); writeln(g,k); close(g);end;(* d(i,j) = dap so cua bai toan voi a[1..i], b[1..j] d(i,j) = d(i-2,j-2) + 1, if a[i] = b[j] = Max begin d(i,j-1), d(i-1,j) end;, elsewhere = 0, if i < 1 || j < 1*)function QHD: int; var i, j, v: int; c: array[1..3] of mi1; x, y, z, t: int;begin x := 1; y := 2; z := 3; { Init i = 0 } fillchar(c[x],sizeof(c[x]), 0); { Init i = 1 } c[y][0] := 0; v := 0; for j := 1 to m do begin if (a[1] = b[j]) then v := 1; c[y][j] := v; end; v := 0; for i := 2 to n do begin c[z][0] := 0; if (a[i] = b[1]) then v := 1; c[z][1] := v; for j := 2 to m do if (a[i] = b[j]) then c[z][j] := c[x][j-2]+1 else c[z][j] := Max(c[z][j-1],c[y][j]); t := x; x := y; y := z; z := t; end; QHD := c[y][m];end;BEGIN Doc; Ghi(QHD); write(nl, Fini ); readln; END.Chương trình CPP /* DevC++ CCKLK.CPP k: chieu dai day con chung khong lien ke dai nhat cua hai day so nguyen duong a[1..n], b[1..m] */ #include #include using namespace std; // D A T A A N D V A R I A B L E const char * fn = ccklk.inp; const char * gn = ccklk.out; const int mn = 1001; int n, m; int a[mn],b[mn]; // P R O T O T Y P E S void Doc(); int QHD(); // Quy hoach dong void Ghi(int); int Max(int,int); // I M P L E M E N T A T I O N int main() { Doc(); Ghi(QHD()); cout > n >> m; cout = 0, if i < 1 || j < 1 */ int QHD() { int *x, *y, *z, *t; int i, j , m1 = m+1, v ; x = new int[m1]; y = new int[m1]; z = new int[m1]; // Init i = 0 memset(x,0,sizeof(int)*m1); // Init i = 1 y[0] = 0; v = 0; for (j = 1; j #include #include //#include using namespace std;// D A T A A N D V A R I A B L E Schar * fn = ondinh.inp;char * gn = ondinh.out;const int mn = 10001;const int mm = 50001;typedef struct { int a, b; } cung;cung c[mm];int len[mn]; // len[i] chieu dai s => ichar mark[mn]; // mark[i] danh dau dinh i: // Chua xet 0; Co trong hang doi q 1; Da xu li 2int d[mn]; // d[i] so luong duong ngan nhat s => iint q[mn]; // hang doiint n, m, s ; // so d ...
Nội dung trích xuất từ tài liệu:
Ôn tập thi học sinh giỏi quốc gia môn Toán - Tin 2010: Dãy con chung không liền kề dài nhấtThi HSG Quốc gia 2010CCKLK: Dãy con chung không liền kề dài nhấtCho dãy số nguyên dương x = (x1, x2, ..., xn). Dãy y = (xi1, xi2, ..., xik) được gọi là dãy con không liền kề củadãy x nếu 1 i1 < i21 < ... < ik1 n. Cho 2 dãy số nguyên a gồm n phần tử và b gồm m phần tử. Xácđịnh chiều dài k của dãy con chung không liền kề dài nhất của a và b. 2 m, n 1000, 1 ai, bi 10000.CCKLK.INP CCKLK.OUT Giải thích5 6 2 CCKLK.INP: Dòng đầu: n m. Từ dòng thứ hai trở đi: Dãy số a,1 5 3 8 2 tiếp đến là dãy số b.2 1 3 4 2 6 CCKLK.OUT: k.Thuật toánQuy hoạch động.Gọi d(i,j) là đáp số của bài toán khi xét hai dãy a[1..i] và b[1..j]. Ta có: Nếu i ≤ 0 thì ta quy ước d(i,j) = 0, Nếu a[i] = b[j] thì d(i,j) = d(i−2,j−2), Nếu a[i] ≠ b[j] thì d(i,j) = max { d(i−1,j), d(i,j−1) }.Để cài đặt ta dùng 3 mảng một chiều x, y và z với ý nghĩa x[j] = d(i−2,j), y[j] = d(i−1,j) và z[j] = d(i,j). Khiđó hệ thức trên được viết là: Nếu i ≤ 0 thì ta quy ước d(i,j) = 0, Nếu a[i] = b[j] thì d(i,j) = d(i−2,j−2) ứng với z[j] = x[j−2], Nếu a[i] ≠ b[j] thì d(i,j) = max { d(i−1,j), d(i,j−1) } ứng với z[j] = max { y[j], z[j−1] }.Muốn tránh các phép copy dữ liệu từ y sang x; từ z sang y và từ x sang z ta chỉ cần tráo đổi các con trỏmảng.Độ phức tạpO(n.m)Chương trình Pascal (* CCKLK.PAS k: chieu dai day con chung khong lien ke dai nhat cua hai day so nguyen duong a[1..n], b[1..m] *) const fn = ccklk.inp; gn = ccklk.out; bl = #32; nl = #13#10; mn = 1001; type int = integer; mi1 = array[0..mn] of int; var n, m: int; a, b: mi1; function Max(a,b: int): int; begin if a >= b then Max := a else Max := b; end; procedure Doc; var i: int; f: text; begin assign(f,fn); reset(f); read(f,n, m); writeln(n,bl,m); for i := 1 to n do read(f,a[i]); for i := 1 to m do read(f,b[i]); write(nl, a: ); for i := 1 to n do write(a[i],bl); write(nl, b: ); for i := 1 to n do write(b[i],bl); close(f);end;procedure Ghi(k: int); var g: text; begin assign(g,gn); rewrite(g); writeln(g,k); close(g);end;(* d(i,j) = dap so cua bai toan voi a[1..i], b[1..j] d(i,j) = d(i-2,j-2) + 1, if a[i] = b[j] = Max begin d(i,j-1), d(i-1,j) end;, elsewhere = 0, if i < 1 || j < 1*)function QHD: int; var i, j, v: int; c: array[1..3] of mi1; x, y, z, t: int;begin x := 1; y := 2; z := 3; { Init i = 0 } fillchar(c[x],sizeof(c[x]), 0); { Init i = 1 } c[y][0] := 0; v := 0; for j := 1 to m do begin if (a[1] = b[j]) then v := 1; c[y][j] := v; end; v := 0; for i := 2 to n do begin c[z][0] := 0; if (a[i] = b[1]) then v := 1; c[z][1] := v; for j := 2 to m do if (a[i] = b[j]) then c[z][j] := c[x][j-2]+1 else c[z][j] := Max(c[z][j-1],c[y][j]); t := x; x := y; y := z; z := t; end; QHD := c[y][m];end;BEGIN Doc; Ghi(QHD); write(nl, Fini ); readln; END.Chương trình CPP /* DevC++ CCKLK.CPP k: chieu dai day con chung khong lien ke dai nhat cua hai day so nguyen duong a[1..n], b[1..m] */ #include #include using namespace std; // D A T A A N D V A R I A B L E const char * fn = ccklk.inp; const char * gn = ccklk.out; const int mn = 1001; int n, m; int a[mn],b[mn]; // P R O T O T Y P E S void Doc(); int QHD(); // Quy hoach dong void Ghi(int); int Max(int,int); // I M P L E M E N T A T I O N int main() { Doc(); Ghi(QHD()); cout > n >> m; cout = 0, if i < 1 || j < 1 */ int QHD() { int *x, *y, *z, *t; int i, j , m1 = m+1, v ; x = new int[m1]; y = new int[m1]; z = new int[m1]; // Init i = 0 memset(x,0,sizeof(int)*m1); // Init i = 1 y[0] = 0; v = 0; for (j = 1; j #include #include //#include using namespace std;// D A T A A N D V A R I A B L E Schar * fn = ondinh.inp;char * gn = ondinh.out;const int mn = 10001;const int mm = 50001;typedef struct { int a, b; } cung;cung c[mm];int len[mn]; // len[i] chieu dai s => ichar mark[mn]; // mark[i] danh dau dinh i: // Chua xet 0; Co trong hang doi q 1; Da xu li 2int d[mn]; // d[i] so luong duong ngan nhat s => iint q[mn]; // hang doiint n, m, s ; // so d ...
Tìm kiếm theo từ khóa liên quan:
Chương trình passcal Chương trình CPP Tài liệu ôn tập Toán Tin Đề thi học sinh giỏi quốc gia Đề thi học sinh giỏi Tin Đề thi học sinh giỏiTài liệu liên quan:
-
8 trang 407 0 0
-
Bộ đề thi học sinh giỏi môn Lịch sử lớp 12 cấp tỉnh năm 2020-2021 có đáp án
26 trang 380 0 0 -
7 trang 359 0 0
-
Đề thi học sinh giỏi môn GDCD lớp 12 năm 2023-2024 có đáp án - Trường THPT Mai Anh Tuấn, Thanh Hóa
28 trang 315 0 0 -
8 trang 310 0 0
-
Ebook Bồi dưỡng học sinh giỏi Tiếng Anh lớp 5 theo chuyên đề
138 trang 276 0 0 -
Đề thi học sinh giỏi môn Ngữ văn lớp 6 năm 2022-2023 có đáp án - Trường THCS Ninh An
8 trang 274 0 0 -
8 trang 258 0 0
-
Đề thi học sinh giỏi môn Ngữ văn lớp 8 năm 2021-2022 có đáp án - Phòng GD&ĐT Châu Đức
4 trang 247 0 0 -
Đề thi học sinh giỏi cấp tỉnh môn Vật lý THPT năm 2023-2024 có đáp án - Sở GD&ĐT Vĩnh Long
6 trang 242 0 0