题目链接:https://www.luogu.org/problemnew/show/P1880
题目大意:
思路:考虑把环形展开成链:

那么现在只要找到长度为n的区间的合并最小值和最大值就行了。

#include<bits/stdc++.h>
using namespace std;

int a[205];
int s[205];
int dp1[205][205];
int dp2[205][205];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    memset(s, 0, sizeof(s));
    memset(dp1, 0, sizeof(dp1));
    memset(dp2, 0, sizeof(dp2));
    for(int i=1;i<=n*2-1;i++)
    {
        if(i<=n)
        {
            s[i]=s[i-1]+a[i];
        }
        else
        {
            s[i]=s[i-1]+a[i%n];
        }
    }

    for(int Len=2;Len<=n;Len++)
    {
        for(int L=1;L<=n*2-Len;L++)//长度发生改变
        {
            int R=L+Len-1;
            dp1[L][R]=100000000;
            for(int k=L;k<R;k++)
            {
                dp1[L][R]=min(dp1[L][R], dp1[L][k]+dp1[k+1][R]+s[R]-s[L-1]);
                dp2[L][R]=max(dp2[L][R], dp2[L][k]+dp2[k+1][R]+s[R]-s[L-1]);
            }
        }
    }
    int Min=100000000;
    int Max=0;
    for(int i=1;i<=n;i++)//找区间长度为n
    {
        Min=min(dp1[i][i+n-1], Min);
        Max=max(dp2[i][i+n-1], Max);
    }

    cout<<Min<<endl;
    cout<<Max<<endl;

    return 0;
}