Đếm đường đi trên ma trận 1

Xem PDF

Điểm: 400 Thời gian: 2.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Cho ma trận gồm \(H\) hàng và \(W\) cột. Gọi \((i,j)\) là ô vuông ở hàng thứ \(i\) và cột thứ \(j\).

Với mỗi \(i,j(1\le i\le H,1\le j\le W)\), ô vuông \((i,j)\) được mô tả bởi kí tự \(a_{i,j}\). Nếu \(a_{i,j}=\). thì ô vuông này trống rỗng, nếu \(a_{i,j}=\) # thì ô vuông này chứa vật cản.

\(Kaninho\) bắt đầu ở ô vuông \((1,1)\) và muốn đến ô vuông \((H,W)\) bằng việc lặp lại các bước: Đi sang phải hoặc đi xuống dưới ô trống kề với nó.

Tìm số con đường mà \(Kaninho\) có thể đi được từ ô \((1,1)\) đến ô \((H,W)\). Bởi vì đáp án có thể lớn, nên trước khi in ra cần lấy mod \(10^9+7\).

Input

  • Dòng thứ nhất chứa hai số nguyên \(H,W(2\le H,W\le 1000)\)

  • \(H\) dòng tiếp theo, mỗi dòng chứa \(W\) kí tự \(a_{i,1},a_{i,2},...,a_{i,W}(1\le i\le H)\) - thể hiện ma trận \(Kaninho\) cần đi. Biết rằng đề ra luôn đảm bảo các ô \((1,1)\)\((H,W)\) đều trống.

Output

  • In ra đáp án cần tìm.

Example

Test 1

Input
3 4
...#
.#..
....
Output
3
Note


Bình luận

  • v2manhvcl 9:41 p.m. 4 Tháng 1, 2025

    có bài trong vnoi giới hạn 1e5 thì làm kiểu gì nhể :000

    • minhtuanitk20 8:16 p.m. 28 Tháng 9, 2021

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

      • N7hoatt 9:49 a.m. 17 Tháng 8, 2020 chỉnh sửa 3

        HINT

        • đầu tiên ta tạo mảng hai chiều \(dp\) để lưu vị trí của các ô vuông, ta tạo mảng hai chiều \(f\) để lưu số cách đi đến ô \(dp[i][j]\)
        • ta có công thức quy hoạch động:

        \(f[0][1]=1\)

        nếu \(dp[i][j]=\) \('\)#\('\) thì \(f[i][j]=0\)

        nếu \(dp[i][j]=\) \('\).\('\) thì \(f[i][j]=(f[i-1][j]+f[i][j-1])\)%\(1e9+7\)

        kết quả là \(f[h][w]\)

        Reference AC code | \(O(h*w)\)time | \(O(h*w)\)space | DP-general

        int main()
        {
            ios::sync_with_stdio(0);
            cin.tie(0); cout.tie(0);
            f[0][1]=1;
            cin>>h>>w;
            for(int i=1; i<=h; ++i)
            {
                for(int j=1; j<=w; ++j)
                {
                    cin>>dp[i][j];
                    f[i][j]=((dp[i][j]=='#') ? 0 : (f[i-1][j]+f[i][j-1])%mod);
                }
            }
            cout<<f[h][w];
        }
        

        • ekhoavvdd 2:51 p.m. 14 Tháng 8, 2020

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