战略游戏——树形dp+状态机——没有上司的舞会翻版

战略游戏

思路:
由根节点出发,根据状态进行转移:
状态转移方程:

    f[u][0] +=f[i][1];
    f[u][1] += min(f[i][0],f[i][1]);

代码

#include 
#include 
#include 
using namespace std;
const int N =1510;
int f[N][2];
int n;
bool st[N];
vector<int> v[N];
void dfs(int u){
    f[u][1] = 1;
    for(int i : v[u]){
        dfs(i);
        f[u][0] +=f[i][1];
        f[u][1] += min(f[i][0],f[i][1]);
    }
}

int main() {
    while(scanf("%d",&n)==1){
        memset(f,0,sizeof f);
        memset(st, false ,sizeof st);
        for(int i = 0;i<n;i++){
            int a,m,b;
            scanf("%d:(%d)",&a,&m);
            v[a].clear();
            while(m--){
                scanf("%d",&b);
                v[a].push_back(b);
                st[b] = true;
            }
        }



        int root = 0;
        while(st[root]) root++;
        dfs(root);
        cout<<min(f[root][0],f[root][1])<<endl;
    }
    return 0;
}

你可能感兴趣的:(算法基础学习,游戏,深度优先,算法)