Bài toán di chuyển từ Tây sang Đông
Số trang: 10
Loại file: pdf
Dung lượng: 163.96 KB
Lượt xem: 7
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Cho một bảng A kích thước m x n, trên đó ghi các số nguyên. Một người xuất phát tại ô nào đó của cột 1, cần sang cột n (tại ô nào cũng được). Quy tắc: Từ ô A[i, j] chỉ được quyền sang một trong 3 ô A[i, j + 1]; A[i - 1, j + 1]; A[i + 1, j + 1]. Hãy tìm vị trí ô xuất phát và hành trình đi từ cột 1 sang cột n sao cho tổng các số ghi trên đường đi là lớn nhất.
Nội dung trích xuất từ tài liệu:
Bài toán di chuyển từ Tây sang Đông Bài toán di chuyển từ Tây sang ĐôngCho một bảng A kích thước m x n, trên đó ghi các số nguyên. Một người xuất pháttại ô nào đó của cột 1, cần sang cột n (tại ô nào cũng được). Quy tắc: Từ ô A[i, j]chỉ được quyền sang một trong 3 ô A[i, j + 1]; A[i - 1, j + 1]; A[i + 1, j + 1]. Hãytìm vị trí ô xuất phát và hành trình đi từ cột 1 sang cột n sao cho tổng các số ghitrên đường đi là lớn nhất.Gợi ý:Gọi B[i, j] là số điểm lớn nhất có thể có được khi tới ô A[i, j]. Rõ ràng đối vớinhững ô ở cột 1 thì B[i, 1] = A[i, 1]:Với những ô (i, j) ở các cột khác. Vì chỉ những ô (i, j – 1), (i – 1, j – 1), (i + 1, j –1) là có thể sang được ô (i, j), và khi sang ô (i, j) thì số điểm được cộng thêm A[i, j]nữa. Chúng ta cần B[i, j] là số điểm lớn nhất có thể nên B[i, j] = max(B[i, j - 1], B[i- 1, j - 1], B[i + 1, j - 1]) + A[i, j]. Ta dùng công thức truy hồi này tính tất cả cácB[i, j]. Cuối cùng chọn ra B[i, n] là phần tử lớn nhất trên cột n của bảng B và từ đótruy vết tìm ra đường đi nhiều điểm nhất.Cài đặt bằng ngôn ngữ Pascal:PROGRAM tay_dong;CONST Max = 2000000000;VAR A,B,T:ARRAY[0..101,1..100] OF LONGINT; Tong:LONGINT; m,n,dongcuoi:INTEGER;PROCEDURE Nhap;VAR i,j:INTEGER;BEGIN readln(m,n); FOR i:=1 TO m DO BEGIN FOR j:=1 TO n DO read(A[i,j]); readln; END; FOR i:=1 TO n DOEND;FUNCTION Min(i,j:INTEGER):INTEGER;VAR m:INTEGER;BEGIN m:=i-1; IF B[i,j-1] < B[m,j-1] THEN m:=i; IF B[i+1,j-1] < B[m,j-1] THEN m:=i+1; Min:=m;END;PROCEDURE Taobang;VAR i,j,d:INTEGER;BEGIN FOR j:=1 TO n DO BEGIN B[0,j]:=Max; B[m+1,j]:=Max; END; FOR i:=1 TO m DO B[i,1]:=A[i,1]; FOR j:=2 TO n DO FOR i:=1 TO m DO BEGIN d:=min(i,j); B[i,j]:=B[d,j-1]+A[i,j]; T[i,j]:=d; END; tong:=B[1,n]; dongcuoi:=1; FOR i:=2 TO m DO IF tong>B[i,n] THEN BEGIN tong:=B[i,n]; dongcuoi:=i; END;END;PROCEDURE TruyVet(dong,cot:INTEGER);BEGIN IF cot=0 THEN writeln(tong) ELSE BEGIN TruyVet(T[dong,cot],cot-1); write(dong, ); END;END;BEGIN assign(Input,input.inp); reset(Input); assign(Output,Output.out); rewrite(Output); Nhap; Taobang; TruyVet(dongcuoi,n); close(Input); close(Output);END.Cài đặt bằng ngôn ngữ C++#include #include using namespace std;#define MAX 100#define MAXINT 2000000000ifstream fi(Input.inp);ofstream fo(Output.out);int A[MAX+2][MAX+1],B[MAX+2][MAX+1],T[MAX+2][MAX+1],m,n,R,sum;void Enter(){ fi>>m>>n; int i,j; for (i=1; iA[i][j]; fi.ignore(); }}int Min(int i, int j){ int m=i-1; if (B[i][j-1] for (i=1; ivoid Trace(int i, int j){ if (i==0) fo
Nội dung trích xuất từ tài liệu:
Bài toán di chuyển từ Tây sang Đông Bài toán di chuyển từ Tây sang ĐôngCho một bảng A kích thước m x n, trên đó ghi các số nguyên. Một người xuất pháttại ô nào đó của cột 1, cần sang cột n (tại ô nào cũng được). Quy tắc: Từ ô A[i, j]chỉ được quyền sang một trong 3 ô A[i, j + 1]; A[i - 1, j + 1]; A[i + 1, j + 1]. Hãytìm vị trí ô xuất phát và hành trình đi từ cột 1 sang cột n sao cho tổng các số ghitrên đường đi là lớn nhất.Gợi ý:Gọi B[i, j] là số điểm lớn nhất có thể có được khi tới ô A[i, j]. Rõ ràng đối vớinhững ô ở cột 1 thì B[i, 1] = A[i, 1]:Với những ô (i, j) ở các cột khác. Vì chỉ những ô (i, j – 1), (i – 1, j – 1), (i + 1, j –1) là có thể sang được ô (i, j), và khi sang ô (i, j) thì số điểm được cộng thêm A[i, j]nữa. Chúng ta cần B[i, j] là số điểm lớn nhất có thể nên B[i, j] = max(B[i, j - 1], B[i- 1, j - 1], B[i + 1, j - 1]) + A[i, j]. Ta dùng công thức truy hồi này tính tất cả cácB[i, j]. Cuối cùng chọn ra B[i, n] là phần tử lớn nhất trên cột n của bảng B và từ đótruy vết tìm ra đường đi nhiều điểm nhất.Cài đặt bằng ngôn ngữ Pascal:PROGRAM tay_dong;CONST Max = 2000000000;VAR A,B,T:ARRAY[0..101,1..100] OF LONGINT; Tong:LONGINT; m,n,dongcuoi:INTEGER;PROCEDURE Nhap;VAR i,j:INTEGER;BEGIN readln(m,n); FOR i:=1 TO m DO BEGIN FOR j:=1 TO n DO read(A[i,j]); readln; END; FOR i:=1 TO n DOEND;FUNCTION Min(i,j:INTEGER):INTEGER;VAR m:INTEGER;BEGIN m:=i-1; IF B[i,j-1] < B[m,j-1] THEN m:=i; IF B[i+1,j-1] < B[m,j-1] THEN m:=i+1; Min:=m;END;PROCEDURE Taobang;VAR i,j,d:INTEGER;BEGIN FOR j:=1 TO n DO BEGIN B[0,j]:=Max; B[m+1,j]:=Max; END; FOR i:=1 TO m DO B[i,1]:=A[i,1]; FOR j:=2 TO n DO FOR i:=1 TO m DO BEGIN d:=min(i,j); B[i,j]:=B[d,j-1]+A[i,j]; T[i,j]:=d; END; tong:=B[1,n]; dongcuoi:=1; FOR i:=2 TO m DO IF tong>B[i,n] THEN BEGIN tong:=B[i,n]; dongcuoi:=i; END;END;PROCEDURE TruyVet(dong,cot:INTEGER);BEGIN IF cot=0 THEN writeln(tong) ELSE BEGIN TruyVet(T[dong,cot],cot-1); write(dong, ); END;END;BEGIN assign(Input,input.inp); reset(Input); assign(Output,Output.out); rewrite(Output); Nhap; Taobang; TruyVet(dongcuoi,n); close(Input); close(Output);END.Cài đặt bằng ngôn ngữ C++#include #include using namespace std;#define MAX 100#define MAXINT 2000000000ifstream fi(Input.inp);ofstream fo(Output.out);int A[MAX+2][MAX+1],B[MAX+2][MAX+1],T[MAX+2][MAX+1],m,n,R,sum;void Enter(){ fi>>m>>n; int i,j; for (i=1; iA[i][j]; fi.ignore(); }}int Min(int i, int j){ int m=i-1; if (B[i][j-1] for (i=1; ivoid Trace(int i, int j){ if (i==0) fo
Tìm kiếm theo từ khóa liên quan:
Công nghệ thông tin cấu trúc dữ liệu lý thuyết đồ thị Javascript ASP.NET Tin học đại cương giáo trình Tin học đại cương bài giảng Tin học đại cương tài liệu Tin học đại cương lý thuyết Tin học đại cươngGợi ý tài liệu liên quan:
-
52 trang 431 1 0
-
Top 10 mẹo 'đơn giản nhưng hữu ích' trong nhiếp ảnh
11 trang 317 0 0 -
Đề cương chi tiết học phần Cấu trúc dữ liệu và giải thuật (Data structures and algorithms)
10 trang 317 0 0 -
74 trang 302 0 0
-
Ứng dụng công cụ Quizizz thiết kế trò chơi học tập trong giảng dạy học phần tin học đại cương
12 trang 301 0 0 -
96 trang 293 0 0
-
Báo cáo thực tập thực tế: Nghiên cứu và xây dựng website bằng Wordpress
24 trang 289 0 0 -
Đồ án tốt nghiệp: Xây dựng ứng dụng di động android quản lý khách hàng cắt tóc
81 trang 281 0 0 -
EBay - Internet và câu chuyện thần kỳ: Phần 1
143 trang 276 0 0 -
Tài liệu dạy học môn Tin học trong chương trình đào tạo trình độ cao đẳng
348 trang 269 1 0