CF 377C Captains Mode(状压dp+博弈)

题意:两个队打Dota2选英雄,一共有n个英雄,有m个操作,每次操作为ban,或者pick,问操作后第一个队伍减第二个队伍的分数是多少。

思路:可以想到每个队伍都会选剩下的英雄中最强的,因此,这些操作只和最强的m个英雄有关,如果ban了个很弱的英雄,你会发现这没有任何效果……剩下就只有m个英雄,可以用状压dp来搞,用一个二进制数表示状态,1表示该英雄已经被ban或者被选了,dp[state][pos]表示当前状态为state,在第pos个操作时先手-后手的最大分数。

代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define Inf 0x3FFFFFFFFFFFFFFFLL
#define eps 1e-9
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
const int maxn=1<<20;
int dp[maxn][20],n,m;
bool vis[maxn][20];
int hero[110],type[20],op[20];
char str[5];
int f(int st,int pos)
{
    if(vis[st][pos]) return dp[st][pos];
    vis[st][pos]=true;
    int& ans=dp[st][pos];
    ans=-inf;
    if(type[pos])
    {
        for(int i=0;i=0;--i)
    {
        scanf("%s%d",str,&op[i]);
        type[i]=(str[0]=='p');
    }
    sort(hero,hero+n);
    for(int i=0;i

你可能感兴趣的:(dp,博弈,dp)