原文链接:https://www.luogu.com.cn/problem/P1040
AC代码:
#include<iostream>
#include<string.h>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;
#define ll long long
ll dp[35][35],maxn=0;
int n,root[35][35];
vector<ll> vec;
int cmp(const int &a,const int &b){
return a>b;
}
void deal(int x,int y){
if(x>y) return ;
cout<<root[x][y]+1<<" ";
if(x==y){
return ;
}
deal(x,root[x][y]-1);
deal(root[x][y]+1,y);
}
int main(){
ll i,j,k;
cin>>n;
for(i=0;i<35;i++){
for(j=0;j<35;j++){
dp[i][j]=1;root[i][j]=-1;
}
}
for(i=0;i<n;i++){
cin>>j;
vec.push_back(j);
dp[i][i]=j;root[i][i]=i;
}
for(int len=1;len<n;len++){
for(i=0;i+len<n;i++){
j=i+len;
if(dp[i][j]<dp[i+1][j]+dp[i][i]){
dp[i][j]=dp[i+1][j]+dp[i][i];root[i][j]=i;
}
maxn=max(dp[i][j],maxn);
root[i][j]=i;
for(k=i+1;k<j;k++){
if(dp[i][j]<dp[i][k-1]*dp[k+1][j]+dp[k][k]){
dp[i][j]=dp[i][k-1]*dp[k+1][j]+dp[k][k];root[i][j]=k;
}
maxn=max(dp[i][j],maxn);
}
}
}
cout<<maxn<<endl;
deal(0,n-1);
return 0;
}