Polygon game is a single player game. At the beginning, there is a polygon composed of n vertices. Each vertex is given an integer value, and each edge is given an operator "+" or "*". All edges are sequentially numbered with integers from 1 to n.
Step 1 of the game, delete an edge.
The next n-1 step is as follows:
(1) Select an edge e and two vertices V1 and V2 connected by E;
(2) Replace edge E and the two vertices V1 and V2 connected by E with a new vertex. Assign the result obtained from the integer values of vertices V1 and V2 through the operation on edge E to the new vertex.
Finally, all edges are deleted and the game is over. The score of the game is the integer value on the remaining vertices.
Problem: calculate the highest score for a given polygon.
example:
In the given polygon, starting from vertex i(1 ≤ I ≤ n), the clockwise chain p(i, j) with length J (there are j vertices in the chain) can be expressed as v[i], op[i+1],..., v[i+j-1].
If the last merging operation of this chain occurs at op[i+s] (1 ≤ s ≤ j-1), the chain can be divided into two sub chains p(i, s) and p(i+s, j-s) at op[i+s].
– examples
Let m1 be the value obtained by any combination of sub chains p(i, s), and a and b are the minimum and maximum values obtained in all possible combinations, respectively.
m2 is the value obtained by any combination of p(i+s, j-s), while c and d are the minimum and maximum values obtained in all possible combinations, respectively.
According to this definition, there are a ≤ m1 ≤ b, c ≤ m2 ≤ d
- When op[i+s] = '+', there is obviously a+c ≤ m ≤ b+d
- When op[i+s] = '*', min ≤ m ≤ max
In other words, the maximum and minimum values of the main chain can be obtained from the maximum and minimum values of the sub chain.
2. Recursive solutionIt can be seen from the previous analysis that in order to find the maximum value of chain merging, the maximum value and minimum value of sub chain merging must be found at the same time.
Let m[i,j,0] be the minimum value of chain p(i,j) merging, and m[i,j,1] be the maximum value.
If p(i,j) is divided into two sub chains p(i,s) and p(i+s,j-s) with length less than j at op[i+s]
For the convenience of narration, note a=m[i, s,0], b=m[i, s,1], c=m[i+s,j-s,0], d=m[i+s,j-s,0]
- When op[i+s] = '+', m[i,j,0]=a+c, m[i,j,1]=b+d
- When op[i+s] = '*', m[i,j,0]=min, m[i,j,1]=max
Combining the above two points, the maximum value of p(i,j) disconnected at op[i+s] is maxf(i,j,s) and the minimum value is minf(i,j,s), then:
Since there are j-1 cases where the optimal disconnection position s is 1 ≤ s ≤ j-1, it can be seen that:
The initial boundary value is obviously m[i,1,0]=v[i], m[i,1,1]=v[i], 1 ≤ I ≤ n.
The code is as follows:
// Polygon game #include<bits/stdc++.h> using namespace std; #define NMAX 100 int N, m[NMAX+1][NMAX+1][2], v[NMAX+1]; //m[i][j][0], the starting vertex is I, and the number of vertices is J (chain length) char op[NMAX+1]; void MinMax(int n, int i, int s, int j, int &minf, int &maxf); int Polymax(int n, int &p); int main() { int p; cout<<"Please enter the number of polygon vertices: "<<endl; cin>>N; for(int i=1; i<N; i++) { cout<<"Please enter polygon vertices"<<i<<"numerical value:"<<endl; cin>>v[i]; m[i][1][0]=v[i];//initialization m[i][1][1]=v[i]; cout<<"Please enter polygon edges"<<i<<"operator:"<<endl; cin>>op[i]; } cout<<"Polygon game first delete"<<p<<"Strip edge,The result is:"<<Polymax(N, p)<<endl; return 0; } void MinMax(int n, int i, int s, int j, int &minf, int &maxf) //There are n vertices in total. Starting from vertex i, there are j vertices. The disconnection position is r=(i+s-1)%n + 1, the minimum value minf and the maximum value maxf // This function is used to find the minimum and maximum values when the starting vertex is i, the number of vertices (chain length) is j and the disconnection position is r { int e[5]; int a=m[i][s][0], b=m[i][s][1]; int r=(i+s-1)%n + 1;//The actual vertex number at the polygon break position int 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 r=2; r<N; r++) { if(minf>e[r]) minf = e[r]; if(maxf<e[r]) maxf = e[r]; } } } int PolyMax(int n, int &p) { int minf, maxf; for(int j=2; j<=n; j++) { for(int i=1; i<=n; i++) { for(int s=1; s<j; s++) { MinMax(n,i,s,j,minf,maxf); if(m[i][j][0]>minf) m[i][j][0] = minf; //Update array continuously if(m[i][j][1]<maxf) m[i][j][1] = maxf; } } } int temp = m[1][n][1]; int p = 1; for(int i=2; i<=n; i++) if(temp<m[i][n][1]) { temp = m[i][n][1]; p = i; } return temp; }
This article refers to my teacher Bi Fangming's courseware "algorithm design and analysis"
Welcome to my personal blog - George's programming cabin , work hard with me for the big factory offer!