HDU 5005(Compromise-双人目标为最大化不同值的博弈)
Compromise
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 155 Accepted Submission(s): 47
studies his interaction with AMB from a game theoretical perspective. He views his everyday life with AMB as a game.
The game has N "nodes" corresponding to different "states" of life. Each node has several outgoing "edges" representing "actions". A node either belongs to Xiaoqiang or AMB. The nodes and edges form a connected DAG (Directed Acyclic Graph, a graph without cycles).
Each node without outgoing edges has two "utility" values for Xiaoqiang and AMB respectively.
For example, consider the following game:
● Node S: The day begins. AMB has two actions leading to A and B respectively.
● Node A: AMB goes to University P. Xiaoqiang has two actions leading to C and D respectively.
● Node B: AMB goes to University T. Xiaoqiang has two actions leading to D and E respectively.
● Node C: Xiaoqiang and AMB both go to University P. AMB's utility is 102, Xiaoqiang's utility is 99.
● Node D: Xiaoqiang and AMB go to different universities. AMB's utility is 51, Xiaoqiang's utility is 0.
● Node E: Xiaoqiang and AMB both go to University T. AMB's utility is 100, Xiaoqiang's utility is 101.
Life starts from Node S. At each node, either Xiaoqiang or AMB can take an action. Xiaoqiang's aim is to maximize his own utility (and cares nothing about AMB) and AMB's aim is also to maximize his own utility.
AMB thinks, if he goes to node A then Xiaoqiang's best response will be going to node C and he can happily live in University P with Xiaoqiang. In this case AMB's utility is 102 and Xiaoqiang's is 99. Xiaoqiang is not satisfied with this, but it seems there
is nothing Xiaoqiang can do about this. This is the so called Nash Equilibrium.
Until one day Xiaoqiang claims (or, to be exact, swears): "Listen, I was attacked by a paramecium and I became insane. If I am in Node B, I will surely go to Node E. But if I am in Node A, I will go to Node D without hesitation." In this way, he reveals his
whole strategy to AMB, which encodes for each node what Xiaoqiang will do if he arrives at the node. Notice that in this strategy Xiaoqiang's action (going to University T) at a node does not depend on which path is used to arrive at the node. This strategy
is not rational, because at Node A Xiaoqiang's best action should be going to Node C.
But Xiaoqiang makes his claim in such a convincing voice that AMB believes that Xiaoqiang will follow this strategy at all cost however irrational it is. Then AMB finds out that his best strategy will be going to node B, and they will end up at Node E. In this
case, Xiaoqiang's utility is 101. Notice that Xiaoqiang must keep his words after the claim. That is, after the claim Xiaoqiang's strategy is fixed, and AMB will make decisions to maximize his own utility provided Xiaoqiang's strategy.
Given a game, you are to determine:
(1) Xiaoqiang's best utility if he cannot make the claim.
(2) Xiaoqiagn's best utility if he can make the claim.
To make things simple, all utility values are distinct.
Remark: The real world situation is, Xiaoqiang and AMB are currently in Node D because AMB failed to get himself to University T through the entrance exam.
Each test case begins with one integer N, the number of nodes. 1<=N<=200. Life starts from the first node.
Then follows N lines. Each line begins with an integer M indicating the number of actions. 0<=M<N
If M is nonzero, M integers follow. Each integer (in range [1, N]) represents the destination of an outgoing edge. At the end of the line is a character being either 'A' or 'X' describing whether this node belongs to AMB or Xiaoqiang.
If M is zero, two integers follow representing AMB's utility and Xiaoqiang's utility respectively. Utility values are in range [0, 10000] and are distinct.
1
6
2 5 6 A
0 102 99
0 50 0
0 100 101
2 2 3 X
2 3 4 X
99 101
pid=5060" target="_blank">5060
5059 5058 5057解法:
第一问:直接从后向前Dp
第二问:
因为2人目标不同。我们仅仅考虑某个节点V是否能走到。
退一步,考虑calm X是否能让A走到V或比V更糟的节点。
假设办不到。A一定能去比V更优的节点。V走不到
否则,考虑是否能在该策略走到V. //有可能仅仅存在到比V更糟的路径
定义一个节点avi,当且仅当该节点能让A走到V或比V更糟的节点。
那么若存在一条1->V的路径皆为avi就可以
此时X会向V决策,A因为不能去比V更优的节点,也向V决策
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (200+10)
#define MAXM (200*200+10)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
int T,n;
int edge[MAXM],next[MAXM],pre[MAXN],size=0;
void addedge(int u,int v)
{
edge[++size]=v;
next[size]=pre[u];
pre[u]=size;
}
int dp[MAXN][2],who[MAXN];
void max(int &max1,int &max2,int max3)
{
if (max3>=max1) max2=max1,max1=max3;
else if (max3>=max2) max2=max3;
}
bool b[MAXN]; void dfs1(int i)
{
if (who[i]==2||b[i]) return;
b[i]=1;
Forp(i)
{
int v=edge[p];
dfs1(v);
if (dp[i][0]<0||(dp[i][who[i]]<dp[v][who[i]])) memcpy(dp[i],dp[v],sizeof(int)*2);
}
}
bool avi[MAXN];
void dfs_avi(int i,int value)
{
if (b[i]) return;
b[i]=1;
if (who[i]==2)
{
avi[i]=(bool)(dp[i][0]<=value);
return;
} avi[i]=!who[i];
Forp(i)
{
int v=edge[p];
dfs_avi(v,value);
if (!who[i]) avi[i]&=avi[v];
else avi[i]|=avi[v];
}
}
bool dfs_path(int i,int value)
{
if (b[i]) return 0;
b[i]=1;
if (who[i]==2)
{
return (dp[i][0]==value);
}
Forp(i)
{
int v=edge[p];
if (avi[v]) if (dfs_path(v,value)) return 1; } return 0; } int main()
{
// freopen("hdu5005.in","r",stdin);
// freopen(".out","w",stdout);
cin>>T;
while(T--)
{
MEM(pre) size=0;
MEMi(dp) MEM(who)
cin>>n;
For(i,n)
{
int m;
scanf("%d",&m);
if (m)
{
For(j,m) {int v;scanf("%d",&v);addedge(i,v);}
char s[2];
scanf("%s",s); if (s[0]=='A') who[i]=0;else who[i]=1;
}
else
{
who[i]=2;
scanf("%d%d",&dp[i][0],&dp[i][1]);
}
}
MEM(b) dfs1(1); int ans2=-1;
For(i,n) if(who[i]==2)
{
if (ans2<dp[i][1])
{
MEM(avi) MEM(b)
dfs_avi(1,dp[i][0]);
if (avi[1])
{
MEM(b)
if (dfs_path(1,dp[i][0])) ans2=dp[i][1];
}
}
} printf("%d %d\n",dp[1][1],ans2); } return 0;
}
HDU 5005(Compromise-双人目标为最大化不同值的博弈)的更多相关文章
- geotrellis使用(二十二)实时获取点状目标对应的栅格数据值
目录 前言 实现方法 总结 一.前言 其实这个功能之前已经实现,今天将其采用1.0版的方式进行了重构与完善,现将该内容进行总结. 其实这个功能很常见,比如google地球上 ...
- HDU.2516 取石子游戏 (博弈论 斐波那契博弈)
HDU.2516 取石子游戏 (博弈论 斐波那契博弈) 题意分析 简单的斐波那契博弈 博弈论快速入门 代码总览 #include <bits/stdc++.h> #define nmax ...
- HDU 1242 dFS 找目标最短路
//多个起点,要最短得目标,不妨倒过来从目标出发,去找最近的点更新!!!!!!递归时思路要清楚 #include<iostream> #include<cstring> usi ...
- 目标跟踪之meanshift---均值漂移搞起2000过时的
基于灰度均值分布的目标跟踪! http://blog.csdn.net/wds555/article/details/24499599 但他有些有点: 1.不会受遮挡太多影响 Mean Shift跟踪 ...
- HDU 1863:畅通project(带权值的并查集)
畅通project Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 1847 Good Luck in CET-4 Everybody!(巴什博弈)
Good Luck in CET-4 Everybody! HDU - 1847 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Ci ...
- HDU 5289 Assignment (ST算法区间最值+二分)
题目链接:pid=5289">http://acm.hdu.edu.cn/showproblem.php?pid=5289 题面: Assignment Time Limit: 400 ...
- HDU 1848 Fibonacci again and again (斐波那契博弈SG函数)
Fibonacci again and again Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & ...
- HDU 2516 取石子游戏(斐波那契博弈)
取石子游戏 Time Limit: 2000/1000 MS(Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...
随机推荐
- 《深入理解Spark-核心思想与源码分析》(六)第六章计算引擎
RDD是Spark对各类数据计算模型的统一抽象,被用于迭代计算过程以及任务输出结果的缓存读写. 在所有MapReduce框架中,shuffle是连接map任务和reduce任务的桥梁.shuffle性 ...
- 51nod 1040 最大公约数之和 欧拉函数
1040 最大公约数之和 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 Description 给 ...
- mysql 部分参数说明
log_timestamps [5.7] This variable was added in MySQL 5.7.2. Before 5.7.2, timestamps in log message ...
- 【PHP内存泄漏案例】PHP对象递归引用造成内存泄漏
[案例一] 作者:老王 如果PHP对象存在递归引用,就会出现内存泄漏.这个Bug在PHP里已经存在很久很久了,先让我们来重现这个Bug,代码如下: <?php class Foo { funct ...
- Ubuntu 16.04安装cuda7.5 GCC
http://www.linuxidc.com/Linux/2017-01/139320.htm 在介绍Ubuntu 16.04安装 CUDA7.5开始前,先辨析几个概念GPU.NVIDIA.NVID ...
- hdu 2176 取石子游戏
http://acm.hdu.edu.cn/showproblem.php?pid=2176 提示:尼姆博弈,异或 #include <iostream> #include <cst ...
- Assignment (HDU 2853 最大权匹配KM)
Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 在 Linux 系统中安装Load Generator ,并在windows 调用
原文地址:http://www.blogjava.net/qileilove/archive/2012/03/14/371861.html 由于公司需要测试系统的最大用户承受能力,所以需要学习使用lo ...
- vim多行注释与取消
神操作 在vim中编写代码,常常会遇到多行注释和取消注释的情况,在VS中我们可以用默认的快捷键或者在设置中自定义快捷键来解决这个问题. vim既然这么强大,必然也是有快捷键来完成的.下面给出具体步骤: ...
- Python学习(四)数据结构(概要)
Python 数据结构 本章介绍 Python 主要的 built-type(内建数据类型),包括如下: Numeric types int float Text Sequence ...