#include <iostream>
using namespace std;
#define N 1000
int m[N][N][2];
int S[N][N];
char op[N];
void min_max(int n, int i, int s, int j, int* minf, int* maxf)
{
int a = m[i][s][0];
int b = m[i][s][1];//以上为起点 i,长度 s, 以下为起点 i+s,长度 j
int r = (i + s - 1) % n + 1;//i+s
int c = m[r][j - s][0];
int d = m[r][j - s][1];
if (op[r] == '+')
{
*minf = a + c;
*maxf = b + d;
}
else
{
int e[5];//最大值最小值
e[1] = a * c;
e[2] = a * d;
e[3] = b * c;
e[4] = b * d;
*minf = e[1];
*maxf = e[1];
for (r = 2; r < 5; r++)
{
if (*minf > e[r]) *minf = e[r];
if (*maxf < e[r]) *maxf = e[r];
}
}
}
int poly_max(int n)
{
int flag = 0;
int minf, maxf;
for (int j = 2; j <= n; j++)//j为长度
{
for (int i = 1; i <= n; i++)//i为起点
{
for (int s = 1; s < j; s++)//s为断点
{
min_max(n, i, s, j, &minf, &maxf);
if (m[i][j][0] > minf) m[i][j][0] = minf;p(i,j)的最小值小,则更新
if (m[i][j][1] < maxf) {
m[i][j][1] = maxf;
S[i][j] = s;
}
}
}
}
int temp = m[1][n][1];//求n种情况,最后
flag = 1;
for (int i = 2; i <= n; i++)
{
if (temp < m[i][n][1])
{
temp = m[i][n][1];
flag = i + 1;
}
}
cout << "删去第 " << flag - 1 << "条边后得:" << endl;
return temp;
}
int main()
{
int n;
cout << "请您输入多边形的顶点的个数: " << ends;
cin >> n;
for (int i = 1; i <= n; i++)
{
cout << "请输入多边形顶点" << i << "的运算符:" << endl;
cin >> op[i];
cout << "请输入多边形顶点" << i << "的数值:" << endl;
cin >> m[i][1][0];
m[i][1][1] = m[i][1][0];
for (int j = 2; j < n; j++)
{
m[i][j][0] = 0;
m[i][j][1] = 0;
}
}
cout << "最大值为:" << poly_max(n) << endl;
cout << endl;
cout << "m矩阵为:" << endl;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
printf("%3d", m[i][j][0]);
cout << "/";
printf("%3d", m[i][j][1]);
}
cout << endl;
}
cout << "s矩阵为:" << endl;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
printf("%3d", S[i][j]);
}
cout << endl;
}
system("pause");
return 0;
}
多边形游戏问题
于 2022-05-07 15:05:01 首次发布