Codeforces 918D/917B - MADMAX
生活随笔
收集整理的這篇文章主要介紹了
Codeforces 918D/917B - MADMAX
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門:http://codeforces.com/contest/918/problem/D
本題是一個組合游戲問題——DAG上的動態規劃問題。
有一張有向無環圖(DAG)。有兩個玩家在這張圖上進行一個游戲:初始時,玩家A、B各占據一個結點,之后輪流沿著有向邊移動;移動時的邊權是不下降的。無法移動者輸。
請打印一個n×n矩陣,這個矩陣的元代表獲勝方(A/B),其i行j列元的含義如下:玩家A的初始位置為結點i,玩家B的初始位置為結點j。
對于DAG上的組合游戲,可以考慮DP。
定義布爾變量dp(u,v,c),代表當先手的初始位置為結點u,后手的初始位置為結點v,且上一次移動的邊權為c時,先手是否能移動。則:
若存在有向邊<u,x>,使得c≤cost<u,x>,且dp(v,x,cost<u,x>)=0,于是,一旦先手到達結點x后,后手將無法移動:于是先手必勝,即dp(u,v,c)=1;否則先手必敗,即dp(u,v,c)=0。
參考程序如下:
#include <stdio.h> #include <string.h> #define MAX_N 101 #define MAX_C 26int n, m; int adj[MAX_N][MAX_N]; int dp[MAX_N][MAX_N][MAX_C];int dfs(int u, int v, int c) {if (dp[u][v][c] != -1) return dp[u][v][c];for (int x = 1; x <= n; x++) {if (adj[u][x] >= c && !dfs(v, x, adj[u][x]))return dp[u][v][c] = 1;}return dp[u][v][c] = 0; }int main(void) {scanf("%d%d", &n, &m);memset(adj, -1, sizeof(adj));memset(dp, -1, sizeof(dp));while (m--) {int u, v;char ch;scanf("%d%d %c", &u, &v, &ch);adj[u][v] = ch - 'a';}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {if (dfs(i, j, 0)) putchar('A');else putchar('B');}putchar('\n');}return 0; }?
轉載于:https://www.cnblogs.com/siuginhung/p/8401458.html
總結
以上是生活随笔為你收集整理的Codeforces 918D/917B - MADMAX的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 01: MySql简介
- 下一篇: 极简_Gradle多Module项目组建