#include <iostream>//P1040
#include <cstdio>
#include <cmath>
#include <algorithm>
#define MAXN 40
#define int long long
using namespace std;
int n;
int h[MAXN], dp[MAXN][MAXN], troot[MAXN][MAXN];
void print(int l, int r)
{
if (l > r)
{
return;
}
cout << troot[l][r] << " ";
if (l == r)
{
return;
}
print(l, troot[l][r] - 1);
print(troot[l][r] + 1, r);
}
int dfs(int l, int r)
{
if (dp[l][r])
{
return dp[l][r];
}
if (l > r)
{
return 1;
}
for (int root = l; root < r; root++)
{
int temp = dfs(l, root - 1) * dfs(root + 1, r) + h[root];
if (dp[l][r] < temp)
{
dp[l][r] = temp;
troot[l][r] = root;
}
}
return dp[l][r];
}
signed main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> h[i];
dp[i][i] = h[i];
troot[i][i] = i;
}
cout << dfs(1, n) << endl;
print(1, n);
return 0;
}
#include <algorithm>//P1122
#include <complex>
#include <deque>
#include <iostream>
#include <iterator>
#include <list>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#include <cstdio>
#include <iostream>
#include <cmath>
#define MAXN 16010
using namespace std;
int n;
int h[MAXN];
int a[MAXN], b[MAXN], ans[MAXN];
vector<int> v[MAXN];
void dfs(int a, int b)
{
ans[a] = h[a];
for (int i = 0; i < v[a].size(); i++)
{
if (v[a][i] != b)
{
dfs(v[a][i], a);
if (ans[v[a][i]] > 0)
{
ans[a] += ans[v[a][i]];
}
}
}
}
signed main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> h[i];
}
for (int i = 1; i < n; i++)
{
cin >> a[i] >> b[i];
v[a[i]].push_back(b[i]);
v[b[i]].push_back(a[i]);
}
dfs(1, 0);
long long res = -0x777777777;
for (int i = 1; i <= n; i++)
{
res = max(res, (long long)ans[i]);
}
cout << res << endl;
return 0;
}
#include <iostream>//P1040
#include <cstdio>
#include <cmath>
#include <algorithm>
#define MAXN 40
#define int long long
using namespace std;
int n;
int h[MAXN], dp[MAXN][MAXN], troot[MAXN][MAXN];
void print(int l, int r)
{
if (l > r)
{
return;
}
cout << troot[l][r] << " ";
if (l == r)
{
return;
}
print(l, troot[l][r] - 1);
print(troot[l][r] + 1, r);
}
int dfs(int l, int r)
{
if (dp[l][r])
{
return dp[l][r];
}
if (l > r)
{
return 1;
}
for (int root = l; root < r; root++)
{
int temp = dfs(l, root - 1) * dfs(root + 1, r) + h[root];
if (dp[l][r] < temp)
{
dp[l][r] = temp;
troot[l][r] = root;
}
}
return dp[l][r];
}
signed main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> h[i];
dp[i][i] = h[i];
troot[i][i] = i;
}
cout << dfs(1, n) << endl;
print(1, n);
return 0;
}