#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pre(x) (x-1<=0?n:x-1)
const int N=500;
ll num[N],f[N][N];
int op[N];
bool vis[N][N];
int n;
vector<int> line;
ll dp(int l,int r)
{
if(l==r)
{
return num[l];
}
if(vis[l][r])
return f[l][r];
for(int k=l;k<r;k++)
{
ll lx1=dp(l,k),lx2=dp(k+1,r);
if(!vis[l][r])
f[l][r]=op[k]==1?lx1+lx2:lx1*lx2,vis[l][r]=1;
else f[l][r]=max(f[l][r],op[k]==1?lx1+lx2:lx1*lx2);
}
return f[l][r];
}
int main()
{
scanf("%d",&n);
char str[3];
int temp;
for(int i=1;i<=n;i++)
{
scanf("%s%d",str,&temp);
if(str[0]=='t')
op[pre(i)]=1;
else op[pre(i)]=2;
num[i]=temp;
}
for(int i=1+n;i<=n+n;i++)
{
num[i]=num[i-n];
op[i]=op[i-n];
}
ll rua=-100000000;
for(int i=1;i<=n;i++)
{
ll rya=dp(i,i+n-1);
if(rya>=rua)
{
if(rya>rua)
{
line.clear();
line.push_back(i);
rua=rya;
}
else {
line.push_back(i);
}
}
memset(vis,0,sizeof(vis));
}
printf("%lld\n",rua);
for(int i=0;i<line.size();i++)
{
printf("%d ",line[i]);
}
return 0;
}
在我的程序中 op[i]对应的操作对象为num[i]与num[i+1]
op[i]==1代表加法
op[i]==2代表乘法