#include<bits/stdc++.h>
using namespace std;
const int N=310;
int n;
int a[N];
int f[N][N];
int path[N][N];
struct node{
    int l,r;
};
queue<node> q;
vector<int> res;
void print(){
    q.push({1,n});
    while(!q.empty()){
        int l=q.front().l;
        int r=q.front().r;
        q.pop();
        if(l==r) continue;
        int k=path[l][r];
        res.push_back(k);
        q.push({l,k});
        q.push({k+1,r});
    }
    for(auto x:res){
        cout<<x<<" "; 
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int len=2;len<=n;len++){
        for(int l=1;l+len-1<=n;l++){
            int r=l+len-1;
            for(int k=l;k<r;k++){
                //f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+(a[l]+a[r])*a[k]);
                int val=f[l][k]+f[k+1][r]+(a[l]+a[r])*a[k];
                if(val>f[l][r]){
                    f[l][r]=val;
                    path[l][r]=k;
                }
            }
        }

    }
    cout<<f[1][n]<<endl;;
    print();
    return 0;
}

1 条评论

  • 1