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;
}
浙公网安备 33010602011771号