码迷,mamicode.com
首页 > 其他好文 > 详细

动规-多边形游戏

时间:2016-05-12 23:57:54      阅读:420      评论:0      收藏:0      [点我收藏+]

标签:

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;

}

运算结果:

技术分享

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

动规-多边形游戏

标签:

原文地址:http://blog.csdn.net/jimo_lonely/article/details/51347476

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!