Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- const int MAX = 2000000; //2 * 10^5
- const int OO = 0x3f3f3f3f3f3f3f3f;
- int n, arr[3005], pf[MAX];
- int dp[3005][3005];
- int seen[3005][3005];
- int get(int l, int r) {
- if(l > r) return 0;
- return pf[r] - pf[l - 1];
- }
- int solve(int l, int r) {
- if(r == n + 1) return 0;
- if(seen[l][r]) return dp[l][r];
- int k = lower_bound(pf + 1, pf + n + 1, pf[r] + get(l, r)) - pf;
- int ans1 = 0;
- if(get(l, r) <= get(r + 1, k))
- ans1 = solve(r + 1, k) + 1;
- int ans2 = solve(l, r + 1);
- seen[l][r] = 1;
- return dp[l][r] = max(ans1, ans2);
- }
- int32_t main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cin >> n;
- for(int i = 1; i <= n; i++)
- cin >> arr[i], pf[i] = pf[i - 1] + arr[i];
- int ans = 0;
- for(int i = 1; i <= n; i++)
- ans = max(ans, 1 + solve(1, i));
- cout << ans << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement