还有第3种:
以下以最小值为例:
sum也要改
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[300],s[300],dp[300][300];
int S(int i,int j)
{
if (j>n) return s[n]-s[i-1]+s[(j-1)%n+1];
return s[j]-s[i-1];
}
int find()
{
for (int j=2;j<=n;j++) for (int i=1;i<=n;i++)
{
dp[i][j]=222999999;
for (int k=1;k<j;k++)
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[(i+k-1)%n+1][j-k]+S(i,i+j-1));
}
}
int ans=222999999;
for (int i=1;i<=n;i++) ans=min(ans,dp[i][n]);
return ans;
}
int find2()
{
memset(dp,0,sizeof(dp));
for (int j=2;j<=n;j++) for (int i=1;i<=n;i++)
{
for (int k=1;k<j;k++)
{
dp[i][j]=max(dp[i][j],dp[i][k]+dp[(i+k-1)%n+1][j-k]+S(i,i+j-1));
}
}
int ans=0;
for (int i=1;i<=n;i++) ans=max(ans,dp[i][n]);
return ans;
}
int main()
{
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i];
for (int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
cout<<find()<<endl<<find2();
return 0;
}