多边形游戏(DP)

Description

多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符 "+" 或 "*"。所有边依次用整数从1到n编号。

游戏第1步,将一条边删除。

随后的n-1步按以下方式操作:

(1)选择一条边E以及由E连接着的两个顶点V1V2

(2)用一个新的顶点取代边E以及由E连接着的两个顶点V1V2。将由顶点V1V2的整数值通过边E上的运算得到的结果赋予新顶点。

最后,所有边都被删除,游戏结束。游戏的得分就是所剩顶点上的整数值。

问题:对于给定的多边形,计算最高得分W ( -231 < W < 231 )。

Input

输入的第一行是单独一个整数n( 3 ≤ n ≤ 18 ),表示多边形的顶点数(同时也是边数)。接下来第n行,每行包含一个运算符("+"或"*")和一个整数V[i]( -10 < V[i] < 10 ),分别表示第i条边所对应的运算符和第i个顶点上的数值。

Output

输出只有一个整数,表示最高得分W

Sample Input

3
+
2
* 3
+ 1

Sample Output

9

#include<string.h>
#include<stdio.h>
#include<iostream>
#define MAX 102
using namespace std;
int v[MAX];
char op[MAX];
int n,minf,maxf;
int m[MAX][MAX][2];
void minMax(int i,int s,int j)
{
    int e[5];
    int a=m[i][s][0],
        b=m[i][s][1],
        r=(i+s-1)%n+1,
        c=m[r][j-s][0],
        d=m[r][j-s][1];
    if(op[r]==‘+‘)
    {
        minf=a+c;
        maxf=b+d;
    }
    else
    {
        e[1]=a*c;
        e[2]=a*d;
        e[3]=b*c;
        e[4]=b*d;
        minf=e[1];
        maxf=e[1];
        for(int k=2; k<5; k++)
        {
            if(minf>e[k])
                minf=e[k];
            if(maxf<e[k])
                maxf=e[k];
        }
    }
}
int polyMax(){
    for(int i=1;i<=n;i++)
        for(int j=2;j<=n;j++){
            m[i][j][0]=1000000;
            m[i][j][1]=-1000000;
        }
    for(int j=2; j<=n; j++)
        for(int i=1; i<=n; i++)
            for(int s=1; s<j; s++)
            {
                minMax(i,s,j);
                if(m[i][j][0]>minf)
                    m[i][j][0]=minf;
                if(m[i][j][1]<maxf)
                    m[i][j][1]=maxf;
            }
    int temp=m[1][n][1];
    for(int i=2; i<=n;i++)
        if(temp<m[i][n][1]) temp=m[i][n][1];
    return temp;
}
int main()
{
    memset(m,0,sizeof(m));
    cin >> n;
    getchar();
    for(int i=1;i<=n;i++)
    {
        cin >> op[i] >> v[i];
        getchar();
        m[i][1][0]=m[i][1][1]=v[i];
    }
    cout << polyMax() <<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/dichuan/p/7778240.html

时间: 2024-08-29 11:25:50

多边形游戏(DP)的相关文章

动规-多边形游戏

1.题目描述 多边形游戏大概是这样的:看下面的一幅图: 有一个多边形,节点处是数字,边上是运算符,这里只考虑"+"和"*"两种,两个点的数与他们之间的运算符进行运算后的结果数构成新的节点,这样运算到最后只剩一个数,我们要求得能够运算出的最大的数. 2.代码 #include <stdio.h> #include <iostream> using namespace std; int ***m; char *op; void MinMax(in

动态规划--多边形游戏

1.问题描述:   给定N个顶点的多边形,每个顶点标有一个整数,每条边上标有+(加)或是×(乘)号,并且N条边按照顺时针 依次编号为1~N.下图给出了一个N=4个顶点的多边形. 游戏规则 :(1) 首先,移走一条边. (2) 然后进行下面的操作: 选中一条边E,该边有两个相邻的顶点,不妨称为V1和V2.对V1和V2顶点所标的整数按照E上所标运算符号(+或是×)进行运算,得到一个整数:用该整数标注一个新顶点,该顶点代替V1和V2 . 持续进行此操作,直到最后没有边存在,即只剩下一个顶点.该顶点的整

[LuoguP1005]矩阵取数游戏 (DP+高精度)

题面 传送门:https://www.luogu.org/problemnew/show/P1005 Solution 我们可以先考虑贪心 我们每一次都选左右两边尽可能小的数,方便大的放在后面 听起来挺OK的 实则并不OK 反例: 3 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 如果贪心的话,我们会优先把右边那一串2先选了,再去选3和1 但是正确答案显然是先把3和1选了,再去选那一串2 既然贪心不成,我们可以考虑一下DP 然后我们考虑这样一个状态: f[i][j][k] 表示第i

算法设计与分析——多边形游戏(动态规划)

一.问题描述 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“*”.所有边依次用整数从1到n编号. 游戏第1步,将一条边删除. 随后n-1步按以下方式操作: (1)选择一条边E以及由E连接着的2个顶点V1和V2: (2)用一个新的顶点取代边E以及由E连接着的2个顶点V1和V2.将由顶点V1和V2的整数值通过边E上的运算得到的结果赋予新顶点. 最后,所有边都被删除,游戏结束.游戏的得分就是所剩顶点上的整数值. 问题:对于给

游戏 DP

游戏 DP [题意描述] 小喵喵喜欢玩 RPG 游戏.在这款游戏中,玩家有两个属性,攻击和防御,现在小喵喵的攻击和防御都是 1,接下来小喵喵会依次遇到 n 个事件.事件有两种. 1.小喵喵经过修炼,角色升级了,此时可以选择攻击+1 或者防御+1. 2.小喵喵遇到了一个敌人,可以选择战斗或者逃跑.如果战斗, 胜利后得到 a[i]金钱.如果逃跑,则无事发生,但是以后也不能再 回来打这个怪物了. 对于一场战斗来说,如果小喵喵的攻击力大于等于 atk[i],防御 力大于等于 def[i],那么他可以无伤

多边形游戏(经典的环形dp)

描述 一个多边形,开始有n个顶点.每个顶点被赋予一个正整数值,每条边被赋予一个运算符"+"或"*".所有边依次用整数从1到n编号. 现在来玩一个游戏,该游戏共有n步: 第1步,选择一条边,将其删除 随后n-1步,每一步都按以下方式操作:(1)选择一条边E以及由E连接着的2个顶点v1和v2: (2)用一个新的顶点取代边E以及由E连接着的2个顶点v1和v2,将顶点v1和v2的整数值通过边E上的运算得到的结果值赋给新顶点. 最后,所有边都被删除,只剩一个顶点,游戏结束.游

算法设计与分析——多边形游戏(DP)

1.问题描述:   给定N个顶点的多边形,每个顶点标有一个整数,每条边上标有+(加)或是×(乘)号,并且N条边按照顺时针依次编号为1~N.下图给出了一个N=4个顶点的多边形. 游戏规则 :(1) 首先,移走一条边. (2) 然后进行下面的操作: 选中一条边E,该边有两个相邻的顶点,不妨称为V1和V2.对V1和V2顶点所标的整数按照E上所标运算符号(+或是×)进行运算,得到一个整数:用该整数标注一个新顶点,该顶点代替V1和V2 . 持续进行此操作,直到最后没有边存在,即只剩下一个顶点.该顶点的整数

多边形游戏 /// 区间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 Out

Hzoi 2018.2.11多边形 区间DP

给定一个由N个顶点构成的多边形,每个顶点被赋予一个整数值,而每条边则被赋予一个符号:+(加法运算)或者*(乘法运算),所有边依次用整数1到N标识. 一个多边形的图形表示 首次移动,允许将某条边删除: 接下来的每次顺序移动包括下面步骤: 1.选出一条边E,以及由E联接的顶点V1和V2: 2.用一个新的顶点,取代边E及其所联接的两个顶点V1和V2.新顶点要赋予新的值,这个值是对V1和V2,做由E所指定的运算,所得到的结果. 所有边都被删除后,只剩下一个顶点,游戏结束.游戏的得分就是该顶点的数值. 任