1 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int N=410; int w[N]; int s[N]; int f[N][N],g[N][N]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>w[i]; w[i+n]=w[i]; //扩展 } for(int i=1;i<=2*n;i++) { s[i]=s[i-1]+w[i]; //前缀和 } memset(f,0x3f,sizeof f); //初始化无穷大 memset(g,0xcf,sizeof g); //初始化无穷小 for(int i=1;i<=2*n;i++) //初始化自己 { f[i][i]=0; g[i][i]=0; } for(int len=2;len<=n;len++) //枚举区间长度 { for(int l=1;l+len-1<=2*n;l++) //区间左端点 { int r=l+len-1; //区间右端点 for(int k=l;k<r;k++) //枚举合并点 { f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]+s[r]-s[l-1]); } } } int minv=2e9; //最小值 for(int i=1;i+n-1<=2*n;i++) { minv=min(minv,f[i][i+n-1]); //枚举长度为n的区间合并最小值 } for(int len=2;len<=n;len++) { for(int l=1;l+len-1<=2*n;l++) { int r=l+len-1; for(int k=l;k<r;k++) { g[l][r]=max(g[l][r],g[l][k]+g[k+1][r]+s[r]-s[l-1]); } } } int maxv=0;; for(int i=1;i<=n;i++) { maxv=max(maxv,g[i][i+n-1]); } cout<<minv<<endl<<maxv<<endl; return 0; }
- 1
信息
- ID
- 584
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者