动规-多边形游戏
来源:互联网 发布:高校综合数据分析平台 编辑:程序博客网 时间:2024/04/30 11:33
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
1 0
- 动规-多边形游戏
- 【动规】多边形游戏
- 多边形游戏
- 多边形游戏
- 多边形游戏
- 多边形游戏
- 多边形游戏
- 多边形游戏
- 多边形游戏
- 多边形游戏
- 多边形游戏
- tyvj(传球游戏)动规
- SSL_2293--暗黑游戏(动规练习题)
- 多边形游戏源代码
- 多边形游戏算法
- 多边形游戏 java实现
- 多边形游戏(C++)
- 多边形游戏问题
- Codeforences #351 VK CUP
- Linux下图像压缩、格式转换、缩放、旋转
- C++第五次作业
- linux 商业项目 makefile 自动生成工具Autotools的使用
- 面向对象 类的理解
- 动规-多边形游戏
- Java中HashMap的transfer方法理解
- 红黑树
- 【黑马Android】(09)电话听听器
- DP 动态规划 Problem P 1016 不向后走的走路方案数
- 读书笔记JVM探秘之六:编译器的那些事儿
- 已知一个整数n,写一个函数f(n),返回0~n间,每个数中出现的“1”的个数,问最大的F(n)= n中n为多少
- chmod改变文件权限
- Android动画--帧动画和补间动画