//Accepted 244 KB 0 ms //区间dp //石子合并模型 #include <cstdio> #include <cstring> #include <iostream> using namespace std; ; ; ; int dp_min[imax_n][imax_n]; int dp_max[imax_n][imax_n]; int a[imax_n]; ]; int n; int max(int a,int b) { return a>b?a:b; } int min(int a,int b) { return a<b?a:b; } int cal(int a,int b,char s[]) { ]=='t') return a+b; return a*b; } void Dp() { ;i<*n;i++) dp_max[i][i]=dp_min[i][i]=a[i]; ;l<=n;l++) { ;i<*n;i++) { ; *n) break; dp_max[i][j]=Ninf; dp_min[i][j]=Pinf; ;k++) { dp_max[i][j]=max(dp_max[i][j],cal(dp_max[i][k],dp_max[k+][j],s[k+])); dp_max[i][j]=max(dp_max[i][j],cal(dp_min[i][k],dp_min[k+][j],s[k+])); dp_min[i][j]=min(dp_min[i][j],cal(dp_min[i][k],dp_min[k+][j],s[k+])); dp_min[i][j]=min(dp_min[i][j],cal(dp_max[i][k],dp_min[k+][j],s[k+])); dp_min[i][j]=min(dp_min[i][j],cal(dp_min[i][k],dp_max[k+][j],s[k+])); } } } int ans=Ninf; ;i<=n;i++) ans=max(ans,dp_max[i][i+n-]); printf("%d\n",ans); ; ;i<=n;i++) { ]==ans) { ) { printf("%d",i); flag=; } else { printf(" %d",i); } } } printf("\n"); } int main() { while (scanf("%d",&n)!=EOF) { ;i<=n;i++) scanf("%s%d",s[i],&a[i]); ;i<n;i++) { a[n+i]=a[i]; strcpy(s[n+i],s[i]); } Dp(); } ; }