Description
多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符 "+" 或 "*"。所有边依次用整数从1到n编号。
游戏第1步,将一条边删除。
随后的n-1步按以下方式操作:
(1)选择一条边E以及由E连接着的两个顶点V1和V2;
(2)用一个新的顶点取代边E以及由E连接着的两个顶点V1和V2。将由顶点V1和V2的整数值通过边E上的运算得到的结果赋予新顶点。
最后,所有边都被删除,游戏结束。游戏的得分就是所剩顶点上的整数值。
问题:对于给定的多边形,计算最高得分W ( -231 < W < 231 )。
Input
输入的第一行是单独一个整数n( 3 ≤ n ≤ 18 ),表示多边形的顶点数(同时也是边数)。接下来第n行,每行包含一个运算符("+"或"*")和一个整数V[i]( -10 < V[i] < 10 ),分别表示第i条边所对应的运算符和第i个顶点上的数值。
Output
输出只有一个整数,表示最高得分W。
Sample Input
3
+
2
* 3
+ 1
Sample Output
9
#include<string.h> #include<stdio.h> #include<iostream> #define MAX 102 using namespace std; int v[MAX]; char op[MAX]; int n,minf,maxf; int m[MAX][MAX][2]; void minMax(int i,int s,int j) { int e[5]; int a=m[i][s][0], b=m[i][s][1], r=(i+s-1)%n+1, c=m[r][j-s][0], d=m[r][j-s][1]; if(op[r]==‘+‘) { minf=a+c; maxf=b+d; } else { e[1]=a*c; e[2]=a*d; e[3]=b*c; e[4]=b*d; minf=e[1]; maxf=e[1]; for(int k=2; k<5; k++) { if(minf>e[k]) minf=e[k]; if(maxf<e[k]) maxf=e[k]; } } } int polyMax(){ for(int i=1;i<=n;i++) for(int j=2;j<=n;j++){ m[i][j][0]=1000000; m[i][j][1]=-1000000; } for(int j=2; j<=n; j++) for(int i=1; i<=n; i++) for(int s=1; s<j; s++) { minMax(i,s,j); if(m[i][j][0]>minf) m[i][j][0]=minf; if(m[i][j][1]<maxf) m[i][j][1]=maxf; } int temp=m[1][n][1]; for(int i=2; i<=n;i++) if(temp<m[i][n][1]) temp=m[i][n][1]; return temp; } int main() { memset(m,0,sizeof(m)); cin >> n; getchar(); for(int i=1;i<=n;i++) { cin >> op[i] >> v[i]; getchar(); m[i][1][0]=m[i][1][1]=v[i]; } cout << polyMax() <<endl; return 0; }