题目链接: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;
}