多边形游戏(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 102using 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;}

游手好闲会使人心智生锈

多边形游戏(DP)

相关文章:

你感兴趣的文章:

标签云: