LH Quảng cáo: lazijsc@gmail.com

Bài tập  /  Bài đang cần trả lời

Pascal Sau nhiều năm thi HSG kiếm tiền thưởng

pascal Sau nhiều năm thi HSG kiếm tiền thưởng, Tèo dành dụm được một số tiền đủ để mua đất làm nhà. Mảnh đất cậu ta mua được có dạng hình chữ nhật với N mét chiều rộng và M mét chiều dài. Để dễ hình dung, mảnh đất có thể được chia thành N×M ô, mỗi ô có một độ cao nhất định. Nhà của Tèo có thể xây trên một ô hoặc một số ô liền nhau có dạng hình chữ nhật và có cùng độ cao.
Hãy giúp Tèo đếm số phương án có thể xây được ngôi nhà của mình trên mảnh đất đã mua được.
Input
Dòng đầu ghi hai số nguyên N và M (1≤N,M≤1000, 1≤ai,j109)
N dòng tiếp theo, mỗi dòng ghi M số nguyên ai,j biểu thị độ cao của mỗi ô vuông trong mảnh đất.
1 trả lời
Hỏi chi tiết
154
Tham khảo câu trả lời từ Trợ lý ảo Lazi
Để giải bài toán này, ta có thể sử dụng phương pháp quy hoạch động.

Gọi dp[i][j] là số phương án xây dựng ngôi nhà trên mảnh đất có kích thước i x j.

Ta có các trường hợp sau:
- Nếu i = 1 và j = 1, tức là mảnh đất chỉ có 1 ô, thì dp[i][j] = 1.
- Nếu i = 1 và j > 1, tức là mảnh đất có 1 hàng và nhiều cột, ta có thể xây dựng ngôi nhà trên từng ô riêng lẻ, do đó dp[i][j] = j.
- Nếu i > 1 và j = 1, tức là mảnh đất có 1 cột và nhiều hàng, ta cũng có thể xây dựng ngôi nhà trên từng ô riêng lẻ, do đó dp[i][j] = i.
- Nếu i > 1 và j > 1, ta có thể xây dựng ngôi nhà trên một số ô liền nhau có dạng hình chữ nhật và có cùng độ cao. Để tính dp[i][j], ta có thể tính dp[i-1][j] và dp[i][j-1] để xem có bao nhiêu cách xây dựng ngôi nhà trên mảnh đất có kích thước nhỏ hơn. Sau đó, ta cộng thêm số cách xây dựng ngôi nhà trên ô cuối cùng (ô có kích thước i x j) nếu độ cao của ô cuối cùng bằng độ cao của các ô trước đó.

Với công thức trên, ta có thể tính dp[i][j] cho tất cả các giá trị i và j từ 1 đến N và M. Kết quả cuối cùng sẽ là dp[N][M].

Dưới đây là mã giả để giải bài toán này:

```
Nhập N, M
Khởi tạo mảng dp[N+1][M+1] với tất cả các phần tử đều bằng 0

Đặt dp[1][1] = 1

Với i từ 1 đến N:
Với j từ 1 đến M:
Nếu i = 1 và j > 1:
dp[i][j] = j
Ngược lại nếu i > 1 và j = 1:
dp[i][j] = i
Ngược lại nếu i > 1 và j > 1:
Tính dp[i][j] = dp[i-1][j] + dp[i][j-1]
Nếu độ cao của ô cuối cùng bằng độ cao của các ô trước đó:
dp[i][j] += 1

In ra dp[N][M]
```

Độ phức tạp của thuật toán này là O(N*M) với N và M là kích thước của mảnh đất.
0
0
GUNTER OBERDORF ...
08/01 21:38:21
+5đ tặng
program CountBuildingOptions;
var
  n, m: integer;
  a: array[1..1000, 1..1000] of integer;
  f: array[1..1000, 1..1000] of longing;
  i, j: integer;
begin
  read(n, m);
  for i:= 1 to n do
    for j:= 1 to m do
      read(a[i, j]);
  for i:= 1 to n do
    for j:= 1 to m do
      if a[i, j] = a[i-1, j] then
        f[i, j] := f[i-1, j] + 1
      else
        f[i, j] := 1;
  for i:= 1 to n do
    for j:= 1 to m do
      if a[i, j] = a[i, j-1] then
        f[i, j] := min(f[i, j], f[i, j-1] + 1)
      else
        f[i, j] := 1;
  writeln(f[n, m]);
end.
 

Mở khóa để xem toàn bộ nội dung trả lời

(?)
Bạn đã đạt đến giới hạn của mình. Bằng cách Đăng ký tài khoản, bạn có thể xem toàn bộ nội dung trả lời
Cải thiện điểm số của bạn bằng cách đăng ký tài khoản Lazi.
Xem toàn bộ các câu trả lời, chat trực tiếp 1:1 với đội ngũ Gia sư Lazi bằng cách Đăng nhập tài khoản ngay bây giờ
Tôi đã có tài khoản? Đăng nhập

Bạn hỏi - Lazi trả lời

Bạn muốn biết điều gì?

GỬI CÂU HỎI
Học tập không giới hạn cùng học sinh cả nước và AI, sôi động, tích cực, trải nghiệm
Bài tập liên quan
Bài tập Tin học Lớp 8 mới nhất

Hôm nay bạn thế nào? Hãy nhấp vào một lựa chọn, nếu may mắn bạn sẽ được tặng 50.000 xu từ Lazi

Vui Buồn Bình thường

Học ngoại ngữ với Flashcard

×
Trợ lý ảo Trợ lý ảo
×
Gia sư Lazi Gia sư