/* dpmax[i][j]=编号[i,j]合并后的最大值 dpmin[i][j]=编号[i,j]合并后的最小值 if op[k] == + dpmax[i][j]=max(dpmax[i][k]+dpmax[k+1][j]) dpmin[i][j]=min(dpmin[i][k]+dpmin[k+1][j]) else if op[k] == * dpmax[i][j]=max(dpmax[i][k]*dpmax[k+1][j], dpmax[i][k]*dpmin[k+1][j], dpmin[i][k]*dpmax[k+1][j], dpmin[i][k]*dpmin[k+1][j]) dpmin[i][j]=min(dpmax[i][k]*dpmax[k+1][j], dpmax[i][k]*dpmin[k+1][j], dpmin[i][k]*dpmax[k+1][j], dpmin[i][k]*dpmin[k+1][j]) dpmax[i][j] = -1e9 dpmin[i][j] = 1e9 dp[i][i]=arr[i] */ #include #include #include #include using ll = int64_t; int main(){ std::iostream::sync_with_stdio(false); std::cin.tie(nullptr); ll n; std::cin>>n; const ll add=0,mul=1; const ll n21=2*n+1; std::vector> op(n*2+1,std::vector(2)); for(ll i=1;i<=n;i++){ char c; std::cin>>c; if(c=='t'){ op[i][0]=add; }else{ op[i][0]=mul; } std::cin>>op[i][1]; op[i+n]=op[i]; } std::vector> dpmax,dpmin; for(ll s=1;s(n21,-1e9)); dpmin.clear(); dpmin.resize(n21,std::vector(n21,1e9)); for(ll i=s;i<=e;i++){ dpmax[i][i]=op[i][1]; } for(ll i=s;i<=e;i++){ } } }