zoukankan      html  css  js  c++  java
  • 战略游戏

    一颗树。每个节点都可以放士兵

    士兵可以看到相邻的每一条边

    要看到所有的边,问至少需要多少士兵?

     

     上图只需要在1节点放置士兵即可。


    定义状态 dp [ u] [ 0/1 ] 表示u这个节点不放/放士兵,以u为根的子树放置的最少士兵

    根据题意,如果当前节点不放置士兵,那么它的子节点必须全部放置士兵,因为要满足士兵可以看到所有的边,所以

    dp [ u ] [ 0 ] += dp [ u 的儿子 ] [ 1 ] 

    dp[u][1]+=mind[ u的儿子 d[ u的儿子 ][1)

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1509;
    vector<int>vec[maxn];
    int n,k,num,indug[maxn];
    int dp[maxn][2],chu[maxn];
    void dfs(int now)
    {
        dp[now][1]=1;
        dp[now][0]=0;
        for(int i=0;i<vec[now].size();i++)
        {
            int w=vec[now][i];
            dfs(w);
            dp[now][0]+=dp[w][1];
            dp[now][1]+=min(dp[w][1],dp[w][0]);
        }
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>k>>num;
            for(int j=1;j<=num;j++)
            {
                int x;
                cin>>x;
                vec[k].push_back(x);
                indug[x]++;
            }
        }
        memset(dp,20,sizeof(dp));
        int root;//找根 
        for(int i=0;i<=n-1;i++)    if(indug[i]==0)    root=i;
        dfs(root);
        cout<<min(dp[root][1],dp[root][0]);
    }
  • 相关阅读:
    年少时的"胡思乱想"
    daemon框架
    MVC框架,see again
    《Redis设计与实现》读书笔记
    小胖妞洗发水广告
    项目视图 Project Browser
    Unity 基础
    Unity手册-Unity概述
    rabbitmq 命令&& rabbitmq教程(一)
    C#动态方法调用 提高程序的扩展性
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12496789.html
Copyright © 2011-2022 走看看