区间dp
#include <iostream>
#include<bits/stdc++.h>
#include <vector>
using namespace std;
int main() {
// int a, b;
// while (cin >> a >> b) { // 注意 while 处理多个 case
// cout << a + b << endl;
// }
int n;
cin>>n;
vector<int> a(n+1,0);
vector<int> prefixSum(n+1,0);
for(int i=0;i<n;++i)
{
cin>>a[i+1];
prefixSum[i+1]=prefixSum[i]+a[i+1];
// cout<<prefixSum[i+1]<<" ";
}
vector<vector<long long>> dp(n+1,vector<long long>(n+1,0));
for(int len=2;len<=n;++len)
{
for(int start=1;start+len-1<=n;++start)
{
if(len==2)dp[start][start+len-1]=a[start]*a[start+len-1];
for(int mid=start;mid<start+len-1;++mid)
{
dp[start][start+len-1]=max(dp[start][mid]+dp[mid+1][start+len-1]+(prefixSum[mid]-prefixSum[start-1])*(prefixSum[start+len-1]-prefixSum[mid]),dp[start][start+len-1]);
}
}
}
cout<<dp[1][n]<<endl;
return 0;
}
// 64 位输出请用 printf("%lld")

京公网安备 11010502036488号