多边形游戏 /// 区间DP oj1903

Posted _Jessie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多边形游戏 /// 区间DP oj1903相关的知识,希望对你有一定的参考价值。

题目大意:

...

Input

输入的第一行是单独一个整数n( 3 ≤ n ≤ 18 ),表示多边形的顶点数(同时也是边数)。

接下来第n行,每行包含一个运算符("+"或"*")和一个整数V[i]( -10 < V[i] < 10 ),分别表示第i条边所对应的运算符和第i个顶点上的数值。

Output

输出只有一个整数,表示最高得分W ( -231 < W < 231 )。

Sample Input

3
+ 2
* 3
+ 1

Sample Output

9

 

技术分享图片
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
using namespace std;
char e[105];
ll d[105],dp0[105][105],dp1[105][105]; 
/// 存在负数的情况 乘法时负负得正 所有要同时维护最大值和最小值
int main()
{
    int n; scanf("%d\n",&n);
    for(int i=0;i<n;i++)
    {
        cin>>e[(i+n-1)%n]>>d[i];
        dp0[i][1]=dp1[i][1]=d[i];
    }
    /// 默认删除 选择的起点的前一条边
    for(int r=2;r<=n;r++)
        for(int i=0;i<n;i++)
        { 
            dp0[i][r]=INF, dp1[i][r]=-INF;
            for(int k=1;k<r;k++)
            {
                ll  a=dp0[i][k], b=dp0[(i+k)%n][r-k],
                    c=dp1[i][k], d=dp1[(i+k)%n][r-k];
                /// 注意由于是环形 这两处必须取模
                if(e[(i+k-1)%n]==*) 
                {
                    ll tmp[4]={a*b,a*d,c*b,c*d};
                    sort(tmp,tmp+4);
                    dp0[i][r]=min(dp0[i][r],tmp[0]),
                    dp1[i][r]=max(dp1[i][r],tmp[3]);
                }
                else
                {
                    dp0[i][r]=min(dp0[i][r],a+b);
                    dp1[i][r]=max(dp1[i][r],c+d);
                }
            }
        }
    ll ans=0;
    for(int i=0;i<n;i++)
        ans=max(ans,dp1[i][n]);
    printf("%lld\n",ans);

    return 0;
}
View Code

 




以上是关于多边形游戏 /// 区间DP oj1903的主要内容,如果未能解决你的问题,请参考以下文章

Light oj 1044 - Palindrome Partitioning(区间dp)

Light OJ 1031 - Easy Game(区间dp)

台州 OJ 1704 Cheapest Palindrome 回文 区间DP

矩阵连乘 /// 区间DP oj1900

cug oj 1479 Treasure Chest Lock (区间dp 思维)

台州 OJ 2793 石子归并 区间DP