#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#define LL long long
#define mem(a, b) memset(a, b, sizeof(a))
#define N 1010
#define MOD 1000000007
using namespace std;
int n, a[N], f[N][N][2];
char op[N];
int main() {
while(scanf("%d", &n)!=EOF){
for(int i=1; i<=2*n; i++) {
for(int j=1; j<=2*n; j++) {
f[i][j][0]=-0x3f3f3f;//初始化
f[i][j][1]=0x3f3f3f;
}
}
for(int i=1; i<=n; i++) {
getchar();
scanf("%c%d", &op[i], &a[i]);
op[n+i]=op[i], a[n+i]=a[i];
f[i][i][0]=f[i][i][1]=a[i];
f[n+i][n+i][0]=f[i+n][i+n][1]=a[i];
}
int ans=0;
for(int len=2; len<=n; len++) {
for(int l=1; l<=2*n-len; l++) {
int r=l+len-1;
for(int k=l; k<r; k++) {
if(op[k+1]=='t') {//如果是加,只有最大值加最大值等于最大值的情况,最小值也一样
f[l][r][0]=max(f[l][r][0],f[l][k][0]+f[k+1][r][0]);
f[l][r][1]=min(f[l][r][1],f[l][k][1]+f[k+1][r][1]);
}
else {//如果是乘,最大值有最大值乘最大值,最小值乘最小值两种情况,最小值有最大值乘最小值,最小值乘最小值
f[l][r][0]=max(f[l][r][0], max(f[l][k][0]*f[k+1][r][0], f[l][k][1]*f[k+1][r][1]));
f[l][r][1]=min(f[l][r][1], min(f[l][k][1]*f[k+1][r][1], min(f[l][k][0]*f[k+1][r][1],f[l][k][1]*f[k+1][r][0])));
}
}
if(len==n) ans=max(ans, f[l][r][0]);
}
}
cout<<ans<<endl;
int flag=0;
for(int i=1; i<=n; i++) {
if(f[i][i+n-1][0]==ans){
if(flag==0){
cout<<i;
flag=1;
}
else
cout<<" "<<i;
}
}
cout<<endl;
}
}
Polygon POJ - 1179 (区间DP)
最新推荐文章于 2020-05-20 12:42:37 发布