多边形游戏

本文介绍了一种利用动态规划解决多边形游戏的方法。通过建立数组p[i][j]表示从点i开始,长度为j的算术表达式的最大值,结合操作符和操作数,形成最优子结构。在解决过程中需要同时考虑最大和最小值,以应对正负数相乘的情况。最终,算法的时间复杂度为O(n^3)。
摘要由CSDN通过智能技术生成

多边形游戏在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

算法构想

该问题用动态规划中的最优子结构来解决,当把一条边去除除后,再把它拉直,那么这个问题就最后可以变成一条链。那么就和以前写的矩阵连乘问题和凸多边形最优三角剖分相似,
最后要求的是这个链的表达式算式结果的最大值。
于是我们就可以想到可以用数组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]
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值