动规-多边形游戏

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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值