fmax[l][r]表示合并区间[l,r]的最大分值,
fmin[l][r]表示合并区间[l,r]的最小分值
for(k l~r-1)
fmax[l][r]=max(fmax[l][r],fmax[l][k]+f[k+1][r]);
fmax[i]+=sum(l~r)
最小值同理
处理环形就把环搞成一个2倍长度的链,最后枚举长度为n的区间最大得分和最小得分
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #define ll long long 5 using namespace std; 6 const int MAXN = 210 ; 7 ll n,s[MAXN][2],f[MAXN][MAXN]; 8 int main() 9 { 10 scanf("%lld",&n); 11 for(int i=1;i<=n;i++) 12 { 13 scanf("%lld",&s[i][0]); 14 s[i-1+n][1]=s[i-1][1]=s[i+n][0]=s[i][0]; 15 } 16 s[n<<1][1]=s[1][0]; 17 for(int len=2;len<=n;len++) 18 for(int l=1;l+len-1<=(n<<1);l++) 19 { 20 int r=l+len-1; 21 for(int k=l;k<r;k++) 22 f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+s[l][0]*s[r][1]*s[k][1]); 23 } 24 ll ans=0; 25 for(int i=1;i<=n;i++) 26 ans=max(ans,f[i][i+n-1]); 27 printf("%lld\n",ans); 28 return 0; 29 }