动规-多边形游戏

来源:互联网 发布:高校综合数据分析平台 编辑:程序博客网 时间:2024/04/30 11:33

1.题目描述

多边形游戏大概是这样的:看下面的一幅图:

1

有一个多边形,节点处是数字,边上是运算符,这里只考虑“+”和“*”两种,两个点的数与他们之间的运算符进行运算后的结果数构成新的节点,这样运算到最后只剩一个数,我们要求得能够运算出的最大的数。

2.代码

#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;}

运算结果:

2

6480 = 6*(2+8)*9*12

1 0
原创粉丝点击