码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 918D - MADMAX

时间:2018-01-31 00:52:05      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:状态   return   else   std   end   als   pac   set   记忆化   

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

 

Codeforces 918D - MADMAX

标签:状态   return   else   std   end   als   pac   set   记忆化   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!