总结:
这个题开始我用scanf %c来录入字符,但是最后错误,发现,scanf是可以吃掉空格的,所以当用scanf录入字符串时,要用getchar()吃掉空格
还有就是区间dp,就是划分区间,求里面的最值,然后扩大区间
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=32767,N=110;
int num[N];
char op[N];
int f[N][N],g[N][N];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>op[i]>>num[i];
op[i+n]=op[i];
num[i+n]=num[i];
}
for(int len=1;len<=n;len++)
{
for(int l=1;l+len-1<=2*n;l++)
{
int r=l+len-1;
if(len==1)
f[l][r]=g[l][r]=num[l];
else
{
f[l][r]=-INF,g[l][r]=INF;
for(int k=l;k<r;k++)
{
char nowOp=op[k+1];
int maxl=f[l][k];
int maxr=f[k+1][r];
int minl=g[l][k];
int minr=g[k+1][r];
if(nowOp=='t')
{
f[l][r]=max(f[l][r],maxl+maxr);
g[l][r]=min(g[l][r],minl+minr);
}
else
{
int x1=maxl*maxr,x2=maxl*minr,x3=minl*maxr,x4=minl*minr;
f[l][r]=max(f[l][r],max(max(x1,x2),max(x3,x4)));
g[l][r]=min(g[l][r],min(min(x1,x2),min(x3,x4)));
}
}
}
}
}
int res=-INF;
for(int i=1;i<=n;i++)
res=max(res,f[i][i+n-1]);
printf("%d\n",res);
for(int i=1;i<=n;i++)
if(res==f[i][i+n-1])
printf("%d ",i);
return 0;
}