Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define fi first
- #define se second
- #define pb push_back
- #define pf push_front
- #define popb pop_back
- #define popf pop_front
- #define ins insert
- #define pq priority_queue
- #define minEle min_element
- #define maxEle max_element
- #define lb lower_bound //first pos >= val
- #define ub upper_bound // first pos > val
- #define cnt_bit __builtin_popcount
- #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
- //#pragma GCC optimize("Ofast")
- //#pragma GCC target("avx,avx2,fma")
- using namespace std;
- typedef long long ll;
- typedef pair<ll, ll> pll;
- typedef pair<int, int> pii;
- int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
- int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
- int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
- const ll oo = 1e18;
- const ll maxN = 1e6;
- /* Author : Le Ngoc Bao Anh, 10A5, LQD High School for Gifted Student */
- void maximize(int &a, int b) {
- a = max(a, b);
- }
- void minimize(int &a, int b) {
- a = min(a, b);
- }
- ll dp[500][500], pref[maxN], a[maxN];
- ll DP(int L, int R) {
- if(dp[L][R]) return dp[L][R];
- if(L == R) return 0;
- if(L + 1 == R) return a[L] + a[R];
- dp[L][R] = oo;
- for(int mid = L; mid <= R; mid++) {
- dp[L][R] = min(dp[L][R], DP(L, mid) + DP(mid + 1, R) + (pref[mid] - pref[L - 1]) + (pref[R] - pref[mid]));
- }
- return dp[L][R];
- }
- void solve() {
- int n;
- cin >> n;
- for(int i = 1; i <= n; i++) {
- cin >> a[i];
- pref[i] = pref[i - 1] + a[i];
- }
- cout << DP(1, n);
- }
- int main()
- {
- ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- //freopen("input.inp", "r", stdin);
- // ll tc, ddd = 0;
- // cin >> tc;
- // while(tc--) {
- //ddd++;
- //cout << "Case #" << ddd << ": ";
- solve();
- // }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement