Codeforces 918D - MADMAX

918D - MADMAX

思路:

dp+记忆化搜索

状态:dp[i][j][w]表示先手在i节点,后手在j节点,这一轮的字母为w的结果,如果为true,则表示先手必赢,否则后手必赢。

状态转移:如果i连的一条边的权值tw>=w,连向t,那么这个博弈的结果可以由dp[j][t][tw]决定,如果dp[j[t][tw]为false,那么dp[i][j][w]肯定为true(因为先手可以选择走这条边使对于对方来说后手必赢),如果不为false,可以选择不走这条路,如果所有边走过去都不能使dp[i][j][w]为true,那么dp[i][j][w]只能为false。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))

const int N=105;
struct edge{
    int to,w,next;
}edge[N*N];
int head[N];
int dp[N][N][26];
int cnt=0;
void add_edge(int u,int v,int w){
    edge[cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
bool dfs(int u,int v,int w){
    if(dp[u][v][w]!=-1)return dp[u][v][w];
    dp[u][v][w]=false;
    for(int i=head[u];~i;i=edge[i].next){
        if(edge[i].w>=w&&!dfs(v,edge[i].to,edge[i].w)){
            dp[u][v][w]=true;
            break;
        }
    }
    return dp[u][v][w];
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m,u,v;
    char c;
    mem(head,-1);
    mem(dp,-1);
    cin>>n>>m;
    for(int i=0;i<m;i++){
        cin>>u>>v>>c;
        add_edge(u,v,c-‘a‘);
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(dfs(i,j,0))cout<<‘A‘;
            else cout<<‘B‘;
        }
        cout<<endl;
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/widsom/p/8387750.html

时间: 2024-11-10 06:33:24

Codeforces 918D - MADMAX的相关文章

Codeforces 918D MADMAX 图上dp 组合游戏

题目链接 题意 给定一个 \(DAG\),每个边的权值为一个字母.两人初始各占据一个顶点(可以重合),轮流移动(沿着一条边从一个顶点移动到另一个顶点),要求每次边上的权值 \(\geq\) 上一次的权值.无法移动者输. 要求:对所有可能的初始情况,给出一张胜负表. 思路 特殊情况 两人在同一个顶点上,那么必然是先手输: 如果有\(u\rightarrow v\)边,并且先手在 \(u\) 上,后手在 \(v\) 上,且先手此时可以移动(判断边的权值),那么必然是先手赢 一般情况 考虑用 \(dp

Codeforces 917B MADMAX (DP+博弈)

<题目链接> 题目大意:给定一个DAG图,其中图的边权是给定的字符所对应的ascii码,现在A先手,B后手,每次沿DAG图走一步,但是第i次走的边权一定要大于等于第i-1次走的边权(这里是值两个人一起的第$i$次,不是一个人走动的第$i$次),最先无法走动的人输.让你对$A,B$的起始位置邻接矩阵$(i,j)$(代表A从$i$点出发,$B$从$j$点开始出发),对应给出他们的胜负情况,如果A胜,输出A,反之,输出B. 解题分析: $dp[x][y][k]$表示先手$x$,后手$y$,边权为$k

Codeforces Round #459 (Div. 2)题解

补题 codeforces 918C 题意 给定一个含有通配符?和()的字符串,问有多少子串是括号匹配的 解题思路 首先考虑不用栈求括号匹配的方法: bool solve(char* s) { int top=0; for (int i=0;i<strlen(s);i++) { if(s[i]=='(') top++; else top--; if(top<0) return false; } return top==0; } 由于在使用栈的括号匹配算法中,栈内是不存在)的,所以不难证明这个算

Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp

Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以当作 ( 可 ) . 问这个字符串有多少个子串是正确的括号串. tags:好考思维,想不到.. 预处理出每个字符向左向右最多可以匹配到哪里,再 O(n*n) 枚举所有区间,看是否符合条件. // C #include<bits/stdc++.h> using namespace std; #pra

【codeforces 718E】E. Matvey&#39;s Birthday

题目大意&链接: http://codeforces.com/problemset/problem/718/E 给一个长为n(n<=100 000)的只包含‘a’~‘h’8个字符的字符串s.两个位置i,j(i!=j)存在一条边,当且仅当|i-j|==1或s[i]==s[j].求这个无向图的直径,以及直径数量. 题解:  命题1:任意位置之间距离不会大于15. 证明:对于任意两个位置i,j之间,其所经过每种字符不会超过2个(因为相同字符会连边),所以i,j经过节点至多为16,也就意味着边数至多

Codeforces 124A - The number of positions

题目链接:http://codeforces.com/problemset/problem/124/A Petr stands in line of n people, but he doesn't know exactly which position he occupies. He can say that there are no less than a people standing in front of him and no more than b people standing b

Codeforces 841D Leha and another game about graph - 差分

Leha plays a computer game, where is on each level is given a connected graph with n vertices and m edges. Graph can contain multiple edges, but can not contain self loops. Each vertex has an integer di, which can be equal to 0, 1 or  - 1. To pass th

Codeforces Round #286 (Div. 1) A. Mr. Kitayuta, the Treasure Hunter DP

链接: http://codeforces.com/problemset/problem/506/A 题意: 给出30000个岛,有n个宝石分布在上面,第一步到d位置,每次走的距离与上一步的差距不大于1,问走完一路最多捡到多少块宝石. 题解: 容易想到DP,dp[i][j]表示到达 i 处,现在步长为 j 时最多收集到的财富,转移也不难,cnt[i]表示 i 处的财富. dp[i+step-1] = max(dp[i+step-1],dp[i][j]+cnt[i+step+1]) dp[i+st

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store