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; }