啊啊啊啊
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 #define MAX 0x3f 5 int f[2005][2005]; 6 int g[2005][2005]; 7 int a[2005],sum[2005]; 8 9 int main() 10 { 11 memset(f,MAX,sizeof(f)); 12 memset(g,0,sizeof(g));//why0?? 13 int n; 14 cin>>n; 15 for(int i=1;i<=n;i++) 16 { 17 cin>>a[i]; 18 a[i+n]=a[i]; 19 } 20 for(int i=1;i<2*n;i++) 21 sum[i]=sum[i-1]+a[i]; 22 for(int i=1;i<2*n;i++) 23 f[i][i]=0;//!!!对角线初始化,保证第一次选择选到0 24 25 for(int i=2*n;i>=1;i--)//阶段 26 for(int j=i+1;j<=2*n-1;j++)//状态 27 { 28 for(int k=i;k<j;k++)//决策 29 f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+sum[j]-sum[i-1]), 30 g[i][j]=max(g[i][j],g[i][k]+g[k+1][j]+sum[j]-sum[i-1]); 31 } 32 int ans1=f[1][n],ans2=g[1][n]; 33 for(int i=1;i<=n;i++) 34 ans1=min(ans1,f[i][i+n-1]), 35 ans2=max(ans2,g[i][i+n-1]); 36 cout<<ans1<<endl<<ans2<<endl; 37 return 0; 38 }