#include<cstdio>
#include<cstring>
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)>(y)?(y):(x))
#define INF 0x3f3f3f3f
int dp1[60][60];
int dp2[60][60];
int main()
{
int n;
char lo[60][3];
int d[60];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s%d",lo[i],&d[i]);
for(int i=0;i<n;i++)
dp1[i][i]=dp2[i][i]=d[i];
for(int len=1;len<n;len++)
{
for(int i=0;i<n;i++)
{
int tmax=-INF,tmin=INF;
int j=(i+len)%n;
for(int m=0;m<len;m++)
{
int p1=(i+m)%n;
int p2=(i+m+1)%n;
if(lo[p2][0]=='t')
{
tmax=MAX(tmax,dp1[i][p1]+dp1[p2][j]);
tmin=MIN(tmin,dp2[i][p1]+dp2[p2][j]);
}
else
{
tmax=MAX(tmax,dp1[i][p1]*dp1[p2][j]);
tmax=MAX(tmax,dp2[i][p1]*dp2[p2][j]);
tmax=MAX(tmax,dp1[i][p1]*dp2[p2][j]);
tmax=MAX(tmax,dp2[i][p1]*dp1[p2][j]);
tmin=MIN(tmin,dp1[i][p1]*dp1[p2][j]);
tmin=MIN(tmin,dp2[i][p1]*dp2[p2][j]);
tmin=MIN(tmin,dp1[i][p1]*dp2[p2][j]);
tmin=MIN(tmin,dp2[i][p1]*dp1[p2][j]);
}
}
dp1[i][j]=tmax;
dp2[i][j]=tmin;
}
}
int res=-INF;
for(int i=0;i<n;i++)
{
int j=(i+n-1)%n;
res=MAX(res,dp1[i][j]);
}
printf("%d\n",res);
for(int i=0;i<n;i++)
{
int j=(i+n-1)%n;
if(res==dp1[i][j])
printf("%d ",i+1);
}
printf("\n");
}
poj 1179 循环dp 类似矩阵连乘
最新推荐文章于 2021-10-11 00:05:44 发布