//poj 1179 Polygon (DP) /* 题解:矩阵链乘法变型,不过要注意负负得正,两个最小子结果相乘会得到最大正值。 PS: 这种题初始化比较烦,所以写得比较简单粗糙,好在数据量不大,16MS。。。 */ #include <iostream> #include <algorithm> #include <cmath> using namespace std; const int inf = 1<<28; int n,m; int a[110]; char str[110][2]; int dp[110][110][2]; int main() { while (scanf("%d",&n) != EOF) { for (int i=1;i<=n;i++) { scanf("%s%d",str[i],&a[i]); a[n+i]=a[i]; str[n+i][0]=str[i][0]; } int j,temp; for (int i=1;i<=2*n;i++) for (int j=1;j<=2*n;j++) dp[i][j][1]=-inf,dp[i][j][0]=inf; for (int i=1;i<=2*n;i++) dp[i][i][0]=dp[i][i][1]=a[i]; for (int len=2;len<=n;++len) for (int i=1;i<=2*n-len+1;i++) { j=i+len-1; for (int k=i;k<j;k++) { for (int v=0;v<=1;v++) for (int w=0;w<=1;w++) { temp=str[k+1][0]=='t'?dp[i][k][v]+dp[k+1][j][w]:dp[i][k][v]*dp[k+1][j][w]; dp[i][j][1]=max(dp[i][j][1],temp); dp[i][j][0]=min(dp[i][j][0],temp); } } } int ans=-inf,first=1; for (int i=1;i<=n;i++) ans=max(ans,dp[i][i+n-1][1]); printf("%d/n",ans); for (int i=1;i<=n;i++) if (dp[i][i+n-1][1]==ans) { if (first) first=0; else printf(" "); printf("%d",i); } printf("/n"); } system("pause"); return 0; }