1 条题解
-
1
这题相对于弱化版,只多了两个要点 1 环结构 2 最大值 最大值不难,dp转移方程是一样的,只需要把min改成max,初始值-1e9就可以;
## 关于环结构:
1 2 3 4 5 模拟环结构,把它复制一遍到原数组之后: 1 2 3 4 5 1 2 3 4 5 这样就可以从中取出 2 3 4 5 1 3 4 5 1 2 4 5 1 2 3 5 1 2 3 4 SO,我们只需要枚举起点就可以
using namespace std; int f[305][305]; int d[305][305]; int a[305]; int sum[305]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i];a[i+n]=a[i]; sum[i]=sum[i-1]+a[i]; } for(int i=n+1;i<=2*n;i++) sum[i]=sum[i-1]+a[i]; for(int i=0;i<=2*n;i++) for(int j=0;j<=2*n;j++) if(i!=j) { f[i][j]=1e9; d[i][j]=-1e9; } for(int p=1;p<=n;p++) { for(int l=1;l<=n;l++) for(int i=p;i<=p+n-l;i++) { int j=i+l-1; for(int k=i;k<j;k++) { f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]-sum[i-1]+sum[j]); d[i][j]=max(d[i][j],d[i][k]+d[k+1][j]-sum[i-1]+sum[j]); } } } int ans1=1e9; int ans2=-1e9; for(int i=1;i<=n;i++) {// cout<<i<<": "; ans1=min(ans1,f[i][i+n-1]);//cout<<f[i][i+n-1]<<" "; ans2=max(ans2,d[i][i+n-1]);//cout<<d[i][i+n-1]<<endl; } cout<<ans1<<endl<<ans2; return 0; } //1 2 3 4 1 2 3 4 //1 2 3 4 5 1 2 3 4 5
- 1
信息
- ID
- 832
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 4
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者