Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 4464 | Accepted: 1859 |
Description
Input
Output
Sample Input
4 t -7 t 4 x 2 x 5
Sample Output
33 1 2
Source
// 区间 dp , 本质是石子合并
#include <iostream> #include <algorithm> #include <queue> #include <math.h> #include <stdio.h> #include <string.h> using namespace std; #define MOD 1000000007 int dp_min[110][110],dp_max[110][110]; // dp[i][j]代表 第 i 和 j 个数运算到成一个数时的 最大/小值 int v[110]; char op[110]; int main() { int n; int i,j,k; while(scanf("%d",&n)!=EOF){ getchar(); for(i=1;i<=n;i++){ scanf("%c %d",&op[i],&v[i]); getchar(); // printf("%c %d",op[i],v[i]); op[i+n]=op[i]; v[i+n]=v[i]; } //printf("??"); for(i=1;i<=2*n;i++) { dp_max[i][i]=dp_min[i][i]=v[i]; if(i<2*n){ if(op[i+1]=='t') dp_max[i][i+1]=dp_min[i][i+1]=v[i]+v[i+1]; else dp_max[i][i+1]=dp_min[i][i+1]=v[i]*v[i+1]; } } for(k=3;k<=n;k++) // k 代表求解区间的长度 for(i=1;i+k-1<=2*n;i++){ dp_max[i][i+k-1]=-MOD; dp_min[i][i+k-1]=MOD; for(j=i;j<i+k-1;j++){ if(op[j+1]=='t'){ dp_max[i][i+k-1]=max(dp_max[i][i+k-1],dp_max[i][j]+dp_max[j+1][i+k-1]); dp_min[i][i+k-1]=min(dp_min[i][i+k-1],dp_min[i][j]+dp_min[j+1][i+k-1]); } else{ dp_max[i][i+k-1]=max(dp_max[i][i+k-1],dp_max[i][j]*dp_max[j+1][i+k-1]); dp_max[i][i+k-1]=max(dp_max[i][i+k-1],dp_min[i][j]*dp_min[j+1][i+k-1]); dp_max[i][i+k-1]=max(dp_max[i][i+k-1],dp_max[i][j]*dp_min[j+1][i+k-1]); dp_max[i][i+k-1]=max(dp_max[i][i+k-1],dp_min[i][j]*dp_max[j+1][i+k-1]); dp_min[i][i+k-1]=min(dp_min[i][i+k-1],dp_max[i][j]*dp_max[j+1][i+k-1]); dp_min[i][i+k-1]=min(dp_min[i][i+k-1],dp_max[i][j]*dp_min[j+1][i+k-1]); dp_min[i][i+k-1]=min(dp_min[i][i+k-1],dp_min[i][j]*dp_max[j+1][i+k-1]); dp_min[i][i+k-1]=min(dp_min[i][i+k-1],dp_min[i][j]*dp_min[j+1][i+k-1]); } } } int out[55],cnt=0; int ans=-MOD; for(i=1;i<=n;i++){ if(dp_max[i][i+n-1]>ans){ ans=dp_max[i][i+n-1]; cnt=0; out[cnt]=i; }else if(dp_max[i][i+n-1]==ans){ out[++cnt]=i; } } printf("%d\n",ans); for(i=0;i<cnt;i++) printf("%d ",out[i]); printf("%d\n",out[i]); } return 0; }