• 多边形游戏(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;
    }
  • 相关阅读:
    k8s 使用 Init Container 确保依赖的服务已经启动
    asp.net core 从 3.0 到 3.1
    Github原生CI/CD,初尝Github Actions
    [nginx]编译安装及安全优化
    [nginx]盗链和防盗链场景模拟实现
    [nginx]location语法
    [nginx]站点目录及文件访问控制
    [svc]nginx限制客户端上传附件的大小
    [sql]mysql指引(整理中...)-对db的分类
    [sql]mysql参数(配置)手册
  • 原文地址:https://www.cnblogs.com/dichuan/p/7778240.html
Copyright © 2020-2023  润新知