Kinh nghiệm (OLP 10&11 - 2019)

Xem PDF

Điểm: 300 (p) Thời gian: 1.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Hai anh em An và Bình tham gia một trò chơi thám hiểm trên bảng số \(xTremeMaze\).
Bảng có kích thước \(N\)x\(M\) (\(N\) dòng và \(M\) cột). Các ô trong bảng được đánh số từ trái sang phải và từ
trên xuống dưới.

Tại mỗi ô của bảng có ghi một số nguyên là số điểm kinh nghiệm mà người chơi sẽ nhận được khi
đi vào ô này. Cần lưu ý là số điểm tại một số ô có thể là số âm; khi đó, điểm kinh nghiệm của người
chơi sẽ bị giảm nếu đi vào ô này.

An và Bình bắt đầu tại ô trái trên, đánh số là (\(1, 1\)). Mỗi lượt, một người chỉ có thể di chuyển tới ô
kề cạnh ngay phía dưới hoặc ô kề cạnh ngay bên phải và không được phép đi ra khỏi bảng. Khi đi
qua mỗi ô, người chơi nhận được số điểm kinh nghiệm bằng số nguyên ghi ở ô đó. Hành trình kết
thúc tại ô (\(N, M\)).

Mục tiêu của trò chơi này là hai anh em đạt được tổng số điểm cao nhất có thể. Theo quy định, các ô
mà An và Bình đi qua không được phép trùng nhau, ngoại trừ ô bắt đầu tại vị trí (\(1, 1\)) và ô kết thúc
tại vị trí (\(N, M\)). Quy ước: giá trị điểm kinh nghiệm tại ô (\(1, 1\)) và ô (\(N, M\)) đều bằng 0.

Yêu cầu: Hãy viết chương trình tính tổng số điểm kinh nghiệm lớn nhất mà An cùng với Bình đạt
được.

Input

  • Dòng đầu chứa hai số nguyên \(N\) và M (\(2 \le N, M \le 200\)), số dòng và số cột của bảng.
  • \(N\) dòng tiếp theo, mỗi dòng ghi M số nguyên là số điểm kinh nghiệm tại mỗi ô trên bảng.
    Điểm kinh nghiệm tại mỗi ô có giá trị tuyệt đối không vượt quá 100.

Output

  • Ghi ra duy nhất một số nguyên là tổng điểm lớn nhất mà
    An cùng với Bình đạt được.

Scoring

  • Subtask \(1\) (\(30\%\) số điểm): \(N \le 3\)\(M \le 200\).
  • Subtask \(2\) (\(40\%\) số điểm): \(N \le 50\)\(M \le 50\).
  • Subtask \(3\) (\(30\%\) số điểm): Không có điều kiện gì thêm.

Example

Test 1

Input
3 3
0 2 3
4 5 6
7 8 0
Output
32

Bình luận


  • -7
    doanxem99    10:08 a.m. 31 Tháng 3, 2021 đã chỉnh sửa

    Bình luận bị ẩn vì nhiều phản hồi tiêu cực. Nhấp vào đây để mở.


    • 11
      SPyofgame    10:52 p.m. 30 Tháng 3, 2021 đã chỉnh sửa

      Hint:

      • Gọi (x, y) là vị trí hiện tại của bạn An

      • Gọi (x', y') là vị trí hiện tại của bạn Bình

      • Ban đầu (x, y) = (x', y') = (1, 1)

      • Xét 4 trường hợp di chuyển: {\(\downarrow, \downarrow\)}, {\(\downarrow, \rightarrow\)}, {\(\rightarrow, \downarrow\)}, {\(\rightarrow, \rightarrow\)}

      • Khi đi qua ô nào đó, ta tăng giá trị tại vị trí của 2 bạn

      • Khi di chuyển ra ngoài biên phải \(m\) (\(\rightarrow\)) hoặc xuống qua biên dưới \(n\) (\(\downarrow\)) hoặc 2 thằng gặp nhau tại vị trí khác (1, 1) và (n, m) ta return -oo để loại bỏ tổng tính được vì nó không tham gia kết quả

      • Độ phức tạp \(O(n^2 * m^2)\)

      • Nhận xét: \(x + y = x' + y'\) nên khi biết 3 giá trị thì số còn lại cũng có thể tính được, nên thực tế chỉ cần \(O(n^2 * m)\)

      Advance:

      • Giải với \(n * m \leq 40000\)

      • Giải với vị trí xuất phát khác nhau nhưng cùng điểm đến

      • Giải với vị trí xuất phát giống nhau nhưng khác điểm đến

      • Giải với k vị trí xuất phát đến k điểm đến tương ứng


      • 8
        HynDuf    7:11 a.m. 22 Tháng 3, 2021

        dạ ad ơi em lấy code AC của tác giả chỉnh mảng tử f[N x 2][N][N] thành f[N x 2][N x 2][N x 2] thì lại sai 3 test cuối (Sai giống sol sai của em ạ) ạ? Em đọc code thì thấy p, q ad để chạy từ 0 -> sze[k-1] - 1 mà sze[k-1] là từ 0 -> max[] - min[] có thể lên tới 2 * m ạ.

        2 phản hồi