Solutions of Maximum path 2 - MarisaOJ: Marisa Online Judge

Solutions of Maximum path 2

Select solution language

Write solution here.


zt09nguyenhoangnhatanh    Created at    4 likes

Nhận thấy rằng mọi điểm $(i,j)$ đều có thể được đi đến từ điểm $(i-1,j)$ hoặc $(i,j-1)$ nên để cập nhật số nấm lớn nhất thu được khi đi đến vị trí $(i,j)$, ta sẽ chỉ cần lấy max của số nấm lớn nhất thu được khi đi đến vị trí $(i-1,j)$ và $(i,j-1)$ rồi cộng thêm số nấm tại vị trí $(i,j)$ **Khởi tạo:** - $dp[0][0]=a[0][0]$ - $dp[i][0]=dp[i-1][0]+a[i][0]$ ∀ $i$ thuộc $[1,n-1]$ (do để đi đến vị trí $(i,0)$ chỉ có thể đi từ bên trái sang) - $dp[0][j]=dp[0][j-1]+a[0][j]$ ∀ $j$ thuộc $[1,n-1]$ (do để đi đến vị trí $(0,j)$ chỉ có thể đi từ bên trên xuống) **Công thức chuyển trạng thái:** - $dp[i][j] = max(dp[i][j-1]+a[i][j],dp[i-1][j]+a[i][j])$ **Kết quả:** - $ans = dp[n-1][n-1]$ **Code (C++):** #include <bits/stdc++.h> #define ll long long using namespace std; const int N =1e3; ll n; ll a[N][N], dp[N][N]; int main(){ cin >> n; for(ll i=0;i<n;++i){ for(ll j=0;j<n;++j) cin >> a[i][j]; } dp[0][0]=a[0][0]; for(ll i=1;i<n;++i){ dp[i][0]=dp[i-1][0]+a[i][0]; } for(ll j=1;j<n;++j){ dp[0][j]=dp[0][j-1]+a[0][j]; } for(ll i=1;i<n;++i){ for(ll j=1;j<n;++j){ dp[i][j] = max(dp[i][j-1]+a[i][j],dp[i-1][j]+a[i][j]); } } cout << dp[n-1][n-1] << endl; return 0; } ***Độ phức tạp: O(n²)***