比赛 |
动规 |
评测结果 |
AAAAAAA |
题目名称 |
加分二叉树 |
最终得分 |
100 |
用户昵称 |
Hyoi_0Koto |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2017-06-18 21:27:41 |
显示代码纯文本
#include<cstdio>
#include<cctype>
using namespace std;
typedef long long ll;
const int maxn=33;
int n,w[maxn],r[maxn][maxn];
ll f[maxn][maxn];
inline void in(int &x){
x=0;int f=1;char t=getchar();
while(!isdigit(t)){if(t=='-')f=-1;t=getchar();}
while(isdigit(t)){x=x*10+t-48;t=getchar();}
x*=f;
}
inline int dfs(int u,int v){
f[u][v]=1;
if(u<v){
for(int i=u;i<=v;i++){
int x=f[u][i-1];int y=f[i+1][v];
if(!x){
if(u<=i-1) x=dfs(u,i-1);
else x=1;
}
if(!y){
if(i+1<=v) y=dfs(i+1,v);
else y=1;
}
if(f[u][v]<x*y+w[i]){
f[u][v]=x*y+w[i];
r[u][v]=i;
}
}
}
else{
f[u][v]=w[u];r[u][v]=u;
}
return f[u][v];
}
inline void print(int u,int v)
{
if(r[u][v]) printf("%d ",r[u][v]);
if(r[u][v]) print(u,r[u][v]-1);
if(r[u][v]) print(r[u][v]+1,v);
}
int mian(){
freopen("jfecs.in","r",stdin);
freopen("jfecs.out","w",stdout);
in(n);
for(int i=1;i<=n;i++) in(w[i]);
dfs(1,n);
printf("%d\n",f[1][n]);
print(1,n);
}
int miku=mian();
int main(){;}