环形dp模板 洛谷P1880石子合并题解
#include<bits/stdc++.h>
using namespace std;
int n,minn,maxx,f1[300][300],f2[300][300],num[300];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
num[i+n]=num[i];
}
for(int i=1;i<=2*n;i++){
num[i]=num[i]+num[i-1];
}
for(int r=2;r<=n;r++){
for(int i=1;i<=2*n-r+1;i++){
int j=i+r-1;
f1[i][j]=f1[i+1][j]+num[j]-num[i-1];
f2[i][j]=f2[i+1][j]+num[j]-num[i-1];
for(int k=i;k<j;k++){
f1[i][j]=max(f1[i][j],f1[i][k]+f1[k+1][j]+num[j]-num[i-1]);
f2[i][j]=min(f2[i][j],f2[i][k]+f2[k+1][j]+num[j]-num[i-1]);
}
}
}
maxx=f1[1][n],minn=f2[1][n];
for(int i=2;i<=n;i++){
maxx=max(f1[i][i+n-1],maxx);
minn=min(f2[i][i+n-1],minn);
}
printf("%d\n%d",minn,maxx);
return 0;
}
题目传送门
本蒟蒻洛谷博客传送门