//https://www.luogu.com.cn/problem/P4342
#include<bits/stdc++.h>
#include<unordered_map>
#include<array>
#define ll long long
#define ull unsigned long long
#define all(a) a.begin(),a.end()
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;
const ll mod = 1e9 + 7;
const int N = 2e3 + 5;
int n, a[105], mx[105][105], mi[105][105];
char op[105];
int merge(int x, int y, char p)
{
if (p == 't')
return x + y;
return x * y;
}
void solve()
{
memset(mx, -inf, sizeof mx);
memset(mi, inf, sizeof mi);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> op[i] >> a[i], op[i + n] = op[i], a[i + n] = a[i];
for (int i = 1; i <= n + n; i++)
mx[i][i] = mi[i][i] = a[i];
for (int len = 2; len <= n; len++)
{
for (int l = 1; l + len - 1 <= n + n; l++)
{
int r = l + len - 1;
for (int mid = l; mid < r; mid++)
{
mx[l][r] = max(mx[l][r], merge(mx[l][mid], mx[mid + 1][r], op[mid + 1]));
mx[l][r] = max(mx[l][r], merge(mx[l][mid], mi[mid + 1][r], op[mid + 1]));
mx[l][r] = max(mx[l][r], merge(mi[l][mid], mx[mid + 1][r], op[mid + 1]));
mx[l][r] = max(mx[l][r], merge(mi[l][mid], mi[mid + 1][r], op[mid + 1]));
mi[l][r] = min(mi[l][r], merge(mx[l][mid], mx[mid + 1][r], op[mid + 1]));
mi[l][r] = min(mi[l][r], merge(mx[l][mid], mi[mid + 1][r], op[mid + 1]));
mi[l][r] = min(mi[l][r], merge(mi[l][mid], mx[mid + 1][r], op[mid + 1]));
mi[l][r] = min(mi[l][r], merge(mi[l][mid], mi[mid + 1][r], op[mid + 1]));
}
}
}
int ans = -inf;
for (int i = 1; i <= n; i++)
ans = max(ans, mx[i][i + n - 1]);
vector<int> res;
for (int i = 1; i <= n; i++)
if (mx[i][i + n - 1] == ans)
res.push_back(i);
cout << ans << '\n';
for (int it : res)
cout << it << ' ';
}
signed main()
{
IOS;
int t = 1;
//cin >> t;
while (t--)
solve();
return 0;
}
P4342 [IOI1998]Polygon(区间dp),dp12
于 2022-09-16 16:33:05 首次发布