#include using namespace std; long largestValue(vector &A, int start, int end, unordered_map> &memo) { // TODO: Maybe the condition is < 1, depends if we allow non-pairs if (end - start < 2) return 0; if (memo.count(start) && memo.count(end)) return memo[start][end]; long valueLeft = largestValue(A, start + 1, end, memo); long valueRight = largestValue(A, start, end - 1, memo); long sum = 0; for (int i = start; i < end; i++) { for (int j = i + 1; j <= end; j++) { int product = A[i] * A[j]; sum += product; } } memo[start][end] = max(max(valueLeft, valueRight), sum); return memo[start][end]; } long largestValue(vector &A) { unordered_map> memo; return largestValue(A, 0, A.size() - 1, memo); } int main() { int n; cin >> n; vector A(n); for(int A_i = 0; A_i < n; A_i++){ cin >> A[A_i]; } long result = largestValue(A); cout << result << endl; return 0; }