<p>There is a pizza with <code>3n</code> slices of varying size, you and your friends will take slices of pizza as follows:</p>

<ul>
	<li>You will pick <strong>any</strong> pizza slice.</li>
	<li>Your friend Alice will pick the next slice in the anti-clockwise direction of your pick.</li>
	<li>Your friend Bob will pick the next slice in the clockwise direction of your pick.</li>
	<li>Repeat until there are no more slices of pizzas.</li>
</ul>

<p>Given an integer array <code>slices</code> that represent the sizes of the pizza slices in a clockwise direction, return <em>the maximum possible sum of slice sizes that you can pick</em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2020/02/18/sample_3_1723.png" style="width: 500px; height: 266px;" />
<pre>
<strong>Input:</strong> slices = [1,2,3,4,5,6]
<strong>Output:</strong> 10
<strong>Explanation:</strong> Pick pizza slice of size 4, Alice and Bob will pick slices with size 3 and 5 respectively. Then Pick slices with size 6, finally Alice and Bob will pick slice of size 2 and 1 respectively. Total = 4 + 6.
</pre>

<p><strong class="example">Example 2:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2020/02/18/sample_4_1723.png" style="width: 500px; height: 299px;" />
<pre>
<strong>Input:</strong> slices = [8,9,8,6,1,1]
<strong>Output:</strong> 16
<strong>Explanation:</strong> Pick pizza slice of size 8 in each turn. If you pick slice with size 9 your partners will pick slices of size 8.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>3 * n == slices.length</code></li>
	<li><code>1 &lt;= slices.length &lt;= 500</code></li>
	<li><code>1 &lt;= slices[i] &lt;= 1000</code></li>
</ul>

class Solution {
public:
#define ll int
#define v vector
#define vi vector<int>
#define pll pair<ll, ll>
#define pb push_back
#define nl '\n'
#define f(k, m, n) for(long long k = m; k < n; k++)
#define rf(k, m, n) for(long long k = m; k >= n; k--)
#define andd &&
#define all(arr) arr.begin(), arr.end()
#define F first
#define S second
#define sp ' '
#define yes cout << "YES\n";
#define no cout << "NO\n";
ll fn(ll i, ll pf, ll left, vi &arr, v<v<vi>> &dp){
    ll n = arr.size();
    if(left == 0) return 0;
    if(i > n - 2 andd pf) return 0;
    if(i > n - 1 andd !pf) return 0;
    if(dp[i][pf][left] != -1) return dp[i][pf][left];
    ll ans = fn(i + 1, pf, left, arr, dp);
    ans = max(ans, arr[i] + fn(i + 2, pf, left - 1, arr, dp));
    return dp[i][pf][left] = ans;
}
    int maxSizeSlices(vector<int>& arr) {
        ll n = arr.size();
    v<v<vi>> dp(n, v<vi>(2, vi(n / 3 + 1, -1)));
    ll left = n / 3;
    return max(arr[0] + fn(2, 1, left - 1, arr, dp), fn(1, 0, left, arr, dp));
        
    }
};
17100