多边形游戏![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f0f98a95acea08dc2be7244c7c546fed.png)
算法构想
该问题用动态规划中的最优子结构来解决,当把一条边去除除后,再把它拉直,那么这个问题就最后可以变成一条链。那么就和以前写的矩阵连乘问题和凸多边形最优三角剖分相似,
最后要求的是这个链的表达式算式结果的最大值。
于是我们就可以想到可以用数组p[i][j]来表示从点i开始,链长为j的算术表达式的最大值,用v[i]存储操作数,op[i]存储操作符。如果这条链的最后一次合并运算在op[i+s]处发生(1≤s≤j-1),则可在op[i+s]处将链分割为2个子链p[i][s]和p[i+s][j-s]。这样再按照以前解决动态规划题目时的思路,就可以解决问题了。
由于有两种运算符+和x,并且操作数可能存在负数,考虑两个负数相乘的结果可能比两个正数要大,所以我们同时还需要记录每个链的最大和最小值,然后判断,如果操作符为+的话,只需要两个链的最大值相加即可,如果操作符是x的话,那么必须把各种情况考虑进来,然后再求出最大值。
设m1是对子链p[i][s]的任意一种合并方式得到的值,而a和b分别是在所有可能的合并中得到的最小值和最大值。m2是p[i+s][j-s]的任意一种合并方式得到的值,而c和d分别是在所有可能的合并中得到的最小值和最大值。
因此有a<=m1<=b,c<=m2<=d
(1)当op[i+s]=’+‘时,显然有a+c<=m<=b+d
(2)当op[i+s]=’*'时,有min{ac,ad,bc,bd}<=m<=max{ac,ad,bc,bd}
时间复杂度
动态规划过程需要O(n^ 3)计算时间,总的时间复杂度为O(n^3)
核心代码
void Minmax(int n, int i, int s, int j, int& minf, int& maxf)//求最大值和最小值
{
int a = m[i][s][0]