Parencedence! 夜

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1947

题意:

给出一个表达式 然后两个人轮流对表达式进行操作 每一次操作就加一个括号将一个运算符和两边的数括起来运算 变成一个数(运算结果)

第一个人希望最后结果越大越好  第二个人希望结果越小越好 两人轮流来

第一次 第一个人先开始 得到的结果为 r1

第二次 第二个人先开始 得到的结果为 r2

如果 r1>(-r2) 第一个人胜利

如果 r2<(-r2)第二个人胜利

否则平局

思路:

dfs 搜索所有解空间 当该第一个人操作时 枚举括号加在哪里 取最大的结果

该第二个人时 枚举括号加在哪里 取最小的结果 直到最后只有一个数(最后结果)

考查:

本题考查对dfs的理解和有关博弈的概念

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<cmath>
#define LL long long
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int INF=0x3f3f3f3f;
//const int MOD=1000000009;
const int N=35;
int r1[N],r2[N];
int a[N];
char c[N];
vector<int>vta;
vector<char>vtc;
int dfs(int x,int k)
{
    int tmp=0;
    int x1=vta[x],x2=vta[x+1];
    char c1=vtc[x];
    if(c1=='+')
    tmp=x1+x2;
    if(c1=='-')
    tmp=x1-x2;
    if(c1=='*')
    tmp=x1*x2;
    if(vtc.size()==1)
    return tmp;
    vta.erase(vta.begin()+x);
    vta[x]=tmp;
    vtc.erase(vtc.begin()+x);
    int m=-1;
    for(unsigned int i=0;i<vtc.size();++i)
    {
        if(m==-1)
        m=dfs(i,k^1);
        else
        {
            if(k==0)
            m=max(m,dfs(i,k^1));//cout<<"max"<<endl;}
            else
            m=min(m,dfs(i,k^1));//cout<<"min"<<endl;}
        }
    }
    vta[x]=x2;
    vta.insert(vta.begin()+x,x1);
    vtc.insert(vtc.begin()+x,c1);
    return m;
}
int main()
{
    //freopen("data.in","r",stdin);
    int T;
    cin>>T;
    for(int ca=1;ca<=T;++ca)
    {
       printf("Case %d:\n",ca);
       int n;
       cin>>n;
       vta.clear();
       vtc.clear();
       for(int i=0;i<=n;++i)
       {
           if(i>0)
           {cin>>c[i-1];vtc.push_back(c[i-1]);}
           cin>>a[i];vta.push_back(a[i]);
       }
       int l1=-1;
       for(int i=0;i<n;++i)
       {
           r1[i]=dfs(i,1);
           //cout<<i<<" "<<r1[i]<<endl;
           if(l1==-1||r1[l1]<r1[i])
           l1=i;
       }
       int l2=-1;
       for(int i=0;i<n;++i)
       {
           r2[i]=dfs(i,0);
           //cout<<i<<" "<<r2[i]<<endl;
           if(l2==-1||r2[l2]>r2[i])
           l2=i;
       }
       printf("Player 1 (%d%c%d) leads to %d\n",a[l1],c[l1],a[l1+1],r1[l1]);
       printf("Player 2 (%d%c%d) leads to %d\n",a[l2],c[l2],a[l2+1],r2[l2]);
       if(r1[l1]>(-r2[l2]))
       printf("Player 1 wins\n");
       else if(r1[l1]<(-r2[l2]))
       printf("Player 2 wins\n");
       else
       printf("Tie\n");
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/liulangye/p/2887280.html