标签:
多边形游戏大概是这样的:看下面的一幅图:
有一个多边形,节点处是数字,边上是运算符,这里只考虑“+”和“*”两种,两个点的数与他们之间的运算符进行运算后的结果数构成新的节点,这样运算到最后只剩一个数,我们要求得能够运算出的最大的数。
#include <stdio.h>
#include <iostream>
using namespace std;
int ***m;
char *op;
void MinMax(int n, int i, int s, int j, int& minf, int& maxf);
int PolyMax(int n);
int main()
{
int n;
cout << "请输入数字个数:";
cin >> n;
m = new int**[n + 1];
for (int i = 0; i <= n; i++)
m[i] = new int*[n + 1];
for (int i = 0; i <= n; i++)
for (int j = 0; j <= n; j++)
m[i][j] = new int[2];//第三维0和1表示最小值和最大值
op = new char[n];
//输入循环表达式,必须保证最后输入的一位为运算符
cout << "请输入表达式:";
for (int i = 1; i<n; i++) {
cin >> m[i][1][0];
m[i][1][1] = m[i][1][0];
cin >> op[i + 1];
}
cin >> m[n][1][0];
cin >> op[1];
m[n][1][1] = m[n][1][0];
int max = PolyMax(n);
cout << "最大值为:" << max << endl;
return 0;
}
//求i,j之间的表达式构成的最大值和最小值
void MinMax(int n, int i, int s, int j, int& minf, int& maxf)
{
//设立一个数组分别用于存储ac,ad,bc,bd
int e[5];
int a, b, c, d, r;
a = m[i][s][0];
b = m[i][s][1];
//如果超过了n个元素,回到环的其他位置
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 r = 2; r<5; r++) {
if (minf>e[r])
minf = e[r];
if (maxf<e[r])
maxf = e[r];
}
}
}
//求1...n之间的表达式构成的最大值和最小值
int PolyMax(int n)
{
int minf, maxf;
//通过递推球minf,maxf以及m[i][j][0]和m[i][j][1]
for (int j = 2; j <= n; j++)
for (int i = 1; i <= n; i++) {
//设置最大值和最小值
m[i][j][0] = -2147483647;
m[i][j][0] = 2147483648;
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;
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;
}
运算结果:
6480 = 6*(2+8)*9*12
标签:
原文地址:http://blog.csdn.net/jimo_lonely/article/details/51347476