poj1179

时间:2023-03-10 06:26:59
poj1179
 //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();
     }
     ;
 }