Select solution language
Write solution here.
## Bà i toán yêu cầu bạn tìm tổng lớn nhất từ ba dãy con khác rỗng không giao nhau.
## Má»™t hÆ°á»›ng giải là sá» dụng [Thuáºt toán Kadane](https://vi.wikipedia.org/wiki/B%C3%A0i_to%C3%A1n_m%E1%BA%A3ng_con_l%E1%BB%9Bn_nh%E1%BA%A5t) để tìm tổng lá»›n nhất cho má»—i dãy con. Có thể giải nhÆ° sau:
- Hiểu thuáºt toán -- Khi bạn xét đến phần tá» thứ $i$ trong mảng, thì má»™t là bạn nối tiếp dãy con Ä‘ang có và cá»™ng giá trị đó và o tổng, hai là tạo dãy con má»›i từ phần tỠđó. Từ đó, tổng $S$ lá»›n nhất của má»™t dãy con có thể được tÃnh bằng:
\begin{equation}
S = max(S + A[i], S).
\end{equation}
- Vá»›i thuáºt toán nà y, bạn sẽ xây dá»±ng lần lượt để tìm tổng lá»›n nhất từ ba dãy con. Bạn sẽ xét đến dãy con thứ ba trÆ°á»›c, vì nó sẽ phụ thuá»™c và o tổng lá»›n nhất tìm được từ hai dãy con trÆ°á»›c đó, tÆ°Æ¡ng tá»± dãy con thứ hai sẽ phụ thuá»™c và o tổng của dãy con Ä‘á»™c láºp đầu tiên.
### Code tham khảo:
```
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int INF = 1e9 + 9;
const int LIM = 1e5 + 5;
int n, shelf[LIM];
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; ++i) cin >> shelf[i];
int cur1 = 0, cur2 = 0, cur3 = 0;
int best1 = -INF, best2 = -INF, best3 = -INF;
for (int i = 1; i <= n; ++i) {
cur3 = max(cur3 + shelf[i], best2 + shelf[i]);
best3 = max(best3, cur3);
cur2 = max(cur2 + shelf[i], best1 + shelf[i]);
best2 = max(best2, cur2);
cur1 = max(cur1 + shelf[i], shelf[i]);
best1 = max(best1, cur1);
}
cout << best3;
}