分石子
#include <iostream>
#include <cstdio>
using namespace std;
int dp[105][105],dpb[105][105];
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>dp[i][i];
}
//length begin mid
for(int i=2;i<=n;i++){
for(int j=1;j<=n-i+1;j++){
int end=i+j-1;
dpb[j][end]=0x7f;
for(int k=j;k<end;k++){//divide
//begin-k k+1-end
dp[j][end]=dp[j][k]+dp[k+1][end];
dpb[j][end]=min(dpb[j][end],dp[j][end]+dpb[j][k]+dpb[k+1][end]);
}
}
}
cout<<dpb[1][n];
return 0;
}
环形
#include <iostream>
#include <cstdio>
using namespace std;
int dp[205][205],dpb[205][205],dpc[205][205];
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>dp[i][i];
dp[i+n][i+n]=dp[i][i];
}
//len begin mid
for(int i=2;i<=n;i++){
for(int j=1;j<=2*n-i;j++){
int end=i+j-1;
dpb[j][end]=999999999;
for(int k=j;k<end;k++){
dp[j][end]=dp[j][k]+dp[k+1][end];
dpb[j][end]=min(dpb[j][end],dp[j][end]+dpb[j][k]+dpb[k+1][end]);
dpc[j][end]=max(dpc[j][end],dp[j][end]+dpc[j][k]+dpc[k+1][end]);
}
}
}
int mx=0,mn=99999999;
for(int i=1;i<=n;i++){
mn=min(mn,dpb[i][n+i-1]);
mx=max(mx,dpc[i][n+i-1]);
}
cout<<mn<<endl<<mx;
return 0;
}