Polygon
题意:
“多边形游戏” 是一款单人益智游戏。在游戏开始时,系统给定玩家一个N边形,该N边形由N个顶点和N条边构成,每条边连接两个相邻的顶点。在每个顶点上写有一个整数,可正可负。在每条边上标有一个运算符“+”(加号)或“*” (乘号)。
第一步,玩家需要选择一条边,将它删除。接下来再进行N-1步,在每一步中玩家选择一条边, 把这条边以及该边连接的两个顶点用一个新的顶点代替,新顶点上的整数值等于删去的两个顶点上的数按照删去的边上标有的符号进行计算得到的结果。最终剩下一个顶点,顶点上的数值就是玩家的得分。
请计算对于给定的N边形,玩家最高能获得多少分,以及第一步有哪些策略可以使玩家获得最高得分。
1≤N≤50,保证玩家无论如何操作,顶点上的数值均在[- 32768,32767]之内。
题解:
首先容易想到枚举删除每一条边,dp[l][r]表示把第l到r的顶点合成之后最大的数值。但是把顶点上最大的数值作为子问题的解对于这一题是不行的,因为最大的数值也可以是2个最小的负数相乘得到,但是如果把最大和最小值同时作为子问题的信息,就可以满足最优子结构了。
最大值只能是2个最大值相加或者相乘,或者2个最小值相乘。
最小值只能是2个最小值相加或者相乘,或者一个最大值和一个最小值相乘,或者2个最大值相乘(当2个子区间的最大最小值全为负数时)。
dp[l][r][0] 为区间[l,r] 的最大值, dp[l][r][1] 为区间[l,r] 的最小值;
d p [ l , r , 0 ] = max l ≤ k < r { d p [ l , k , 0 ]   o p   d p [ k + 1 , r , 0 ] op ∈ {+,*} d p [ l , k , 1 ]   ∗   d p [ k + 1 , r , 1 ] dp[l,r,0] = \max\limits_{ l \le k<r } \left\{ \begin{array}{ll} dp[l,k,0 ]\,op \,dp[k+1,r,0] & \textrm{op$\in $\{+,*\} }\\ dp[l,k,1 ]\,* \,dp[k+1,r,1] \end{array} \right. dp[l,r,0]=l≤k<rmax{
dp[l,k,0]opdp[k+1,r,0]dp[l,k,1]∗dp[k+1,r,1]op∈{+,*}
d p [ l , r , 1 ] = min l ≤ k < r {