Skip to content

区间dp ​

cpp
void solve(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>w[i],w[i+n]=w[i];
    for(int len=1;len<=n+1;len++){
        for(int l=1;l+len-1<=2*n;l++){
            int r=l+len-1;
            for(int k=l+1;k<r;k++){
                f[l][r]=max(f[l][r],f[l][k]+f[k][r]+w[l]*w[r]*w[k]);
            }
        }
    }
    ll ans=0;
    for(int i=1;i<=2*n;i++)ans=max(ans,f[i][i+n]);
    cout<<ans;
}