码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-05-27 15:17:53      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:NPU   区间   顶点   include   区间dp   closed   color   删除   默认   

题目大意:

...

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

标签:NPU   区间   顶点   include   区间dp   closed   color   删除   默认   

原文地址:https://www.cnblogs.com/zquzjx/p/9096099.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!