#include<iostream>
#include<cstring>
#define ui unsigned int
#define reg register int
using namespace std;
int n;
int score[31];
ui maxx[31][31];
int findk[31][31];
ui memdfs(int l,int r){
if(l==r){
maxx[l][r]=score[l];
findk[l][r]=l;
return maxx[l][r];
}
for(reg i=l;i<=r;i++){
ui lt,rt;
if(i-1<l){
lt=1;
}
else if(maxx[l][i-1]>0){
lt=maxx[l][i-1];
}
else{
lt=memdfs(l,i-1);
}
if(i+1>r){
rt=1;
}
else if(maxx[i+1][r]>0){
rt=maxx[i+1][r];
}
else{
rt=memdfs(i+1,r);
}
if(lt*rt+score[i]>maxx[l][r]){
maxx[l][r]=lt*rt+score[i];
findk[l][r]=i;
}
}
return maxx[l][r];
}
void layout(int l,int r){
cout<<findk[l][r]<<" ";
if(findk[l][r]-1>=l)layout(l,findk[l][r]-1);
if(findk[l][r]+1<=r)layout(findk[l][r]+1,r);
return;
}
int main(){
memset(maxx,0,sizeof(maxx));
ios::sync_with_stdio(false);
cin>>n;
for(reg i=1;i<=n;i++){
cin>>score[i];
}
cout<<memdfs(1,n)<<endl;
layout(1,n);
return 0;
}
为什么?最优解普遍10毫秒,记忆化就11毫秒,为什么会变成这样?