很简单的递归结构的DP,状态转移方程:dmax(i,j)=max(dmax(i,j),dmax(i,k)<cal>dmax(k+1,j));dmin(i,j)=max(dmin(i,j),dmin(i,k)<cal>dmin(k+1,j))
#include <stdio.h>
#include <string.h>
#define LL unsigned long long
LL ma[110][110];
LL mi[110][110];
LL a[110];
char s[110];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n=1;
while(scanf("%llu%c",&a[n],&s[n])==2)
{
n++;
if(s[n-1]=='\n')break;
}
n--;
// printf("%d\n",n);
memset(mi,0,sizeof(mi));
memset(ma,0,sizeof(ma));
for(int i=1;i<=n;i++)
{
mi[i][i]=a[i];
ma[i][i]=a[i];
}
for(int l=1;l<n;l++)
{
for(int i=1;i+l<=n;i++)
{
mi[i][i+l]=1LL<<62;
ma[i][i+l]=0;
for(int j=i;j<i+l;j++)
{
if(s[j]=='+')
{
if(mi[i][j]+mi[j+1][i+l]<mi[i][i+l])
mi[i][i+l]=mi[i][j]+mi[j+1][i+l];
if(mi[i][j]+mi[j+1][i+l]>ma[i][i+l])
ma[i][i+l]=mi[i][j]+mi[j+1][i+l];
if(ma[i][j]+ma[j+1][i+l]<mi[i][i+l])
mi[i][i+l]=ma[i][j]+ma[j+1][i+l];
if(ma[i][j]+ma[j+1][i+l]>ma[i][i+l])
ma[i][i+l]=ma[i][j]+ma[j+1][i+l];
}
if(s[j]=='*')
{
if(ma[i][j]*ma[j+1][i+l]<mi[i][i+l])
mi[i][i+l]=ma[i][j]*ma[j+1][i+l];
if(ma[i][j]*ma[j+1][i+l]>ma[i][i+l])
ma[i][i+l]=ma[i][j]*ma[j+1][i+l];
if(mi[i][j]*mi[j+1][i+l]<mi[i][i+l])
mi[i][i+l]=mi[i][j]*mi[j+1][i+l];
if(mi[i][j]*mi[j+1][i+l]>ma[i][i+l])
ma[i][i+l]=mi[i][j]*mi[j+1][i+l];
}
}
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=n;j++)
// printf("(%I64d,%I64d) ",ma[i][j],mi[i][j]);
// printf("\n");
// }
printf("%llu %llu\n",ma[1][n],mi[1][n]);
}
return 0;
}