#include <bits/stdc++.h>
using namespace std;
#define rep(_, __, ___) for (int _ = __; _ <= ___; ++_)
#define int long long
int f[1005][1005];
int rev[1005][1005];
int n;
int op[1005], a[1005];
int res[1005], maxans;
signed main()
{
scanf("%lld", &n);
rep(i, 1, n)
{
char ch = getchar();
while (!isalpha(ch))
ch = getchar();
if (ch == 't')
op[i] = op[n + i] = 1;
else
op[i] = op[n + i] = 2;
scanf("%lld", a + i);
a[n + i] = a[i];
}
rep(i, 1, n)
{
int ln = i, rn = n + i - 1;
memset(f, -0x3f, sizeof(f));
memset(rev, 0x3f, sizeof(rev));
rep(j, ln, rn)
f[j][j] = rev[j][j] = a[j];
int ans = -1073741824;
rep(jn, 1, n - 1)
rep(kn, ln, rn - jn)
{
int j = kn, k = kn + jn;
rep(l, j, k - 1)
{
if (op[l + 1] == 1)
{
f[j][k] = max(f[j][k], f[j][l] + f[l + 1][k]);
// f[j][k] = max(f[j][k], rev[j][l] + rev[l + 1][k]);
rev[j][k] = min(rev[j][k], f[j][l] + f[l + 1][k]);
// rev[j][k] = min(rev[j][k], rev[j][l] + rev[l + 1][k]);
}
else
{
f[j][k] = max(f[j][k], f[j][l] * f[l + 1][k]);
f[j][k] = max(f[j][k], rev[j][l] * rev[l + 1][k]);
f[j][k] = max(f[j][k], rev[j][l] * f[l + 1][k]);
f[j][k] = max(f[j][k], f[j][l] * rev[l + 1][k]);
rev[j][k] = min(rev[j][k], f[j][l] * f[l + 1][k]);
rev[j][k] = min(rev[j][k], rev[j][l] * rev[l + 1][k]);
rev[j][k] = min(rev[j][k], rev[j][l] * f[l + 1][k]);
rev[j][k] = min(rev[j][k], f[j][l] * rev[l + 1][k]);
}
}
}
ans = max(ans, f[ln][rn]);
maxans = max(ans, maxans);
res[i] = ans;
}
// int var1 = res[1];
// rep(i, 1, n - 1)
// res[i] = res[i + 1];
// res[n] = var1;
printf("%lld\n", maxans);
rep(i, 1, n)
if (res[i] == maxans)
printf("%lld ", i);
printf("\n");
rep(i, 1, n)
cerr << res[i] << ' ';
return 0;
}
WA on 5#
思路大概和第一篇题解是一样的,数组已经开大,已经全局 long long,大概看了一下转移方程也差不多,实在不知道怎么改了。
求调。