Strategic game 题解

Strategic game

https://ac.nowcoder.com/acm/problem/106060

本题是树的最小点覆盖问题。
设想一个结点放士兵和不放士兵两种情况,如果放士兵,那它的孩子们放不放士兵都无所谓,如果不放士兵,那孩子们必须放士兵(否则将无法覆盖)

那么很容易想到状态转移方程:
dp[root][1]=1+图片说明 min(dp[son][1],dp[son][0])
dp[root][0]=图片说明 dp[son][1]

本题注意事项:
1.直接用一个字符变量c,吃掉所有多余的括号等无关内容
2.多组输入,记得清空邻接表和dp数组
3.最终的答案是在根结点的(因为你是从叶子一路往上推)
4.由于问题求解的是最小答案,跟以往树形dp经典问题不同,本题在状态转移的时候应当取min的操作

以下是代码:

#include <iostream>
#include<string.h>
#include<string>
#include<queue>
#include<algorithm>
#include <cmath>
#include <vector>
#include <sstream>
using namespace std;
const int N = 1550;
bool havepar[N];
vector <int> G[N];
string s;
int dp[N][2];
int Troot;
int n;
void init()
{
    for (int i = 0; i < n; i++)
    {
        G[i].clear();
    }
    memset(havepar, 0, sizeof(havepar));
    memset(dp, 0, sizeof(dp));
}
void dfs(int root)
{
    if (G[root].size() == 0)
    {
        dp[root][1] = 1;
        dp[root][0] = 0;
    }
    for (int i = 0; i < G[root].size(); i++)
    {
        int to = G[root][i];
        dfs(to);
        dp[root][1] += min(dp[to][1], dp[to][0]);
        dp[root][0] += dp[to][1];
    }
    dp[root][1] += 1;
}
int main()
{
    while (scanf("%d", &n) != EOF)
    {
        init();
        int u;
        int num;
        char c;
        for (int i = 0; i < n; i++) 
        {
            scanf("%d%c%c%d", &u, &c, &c, &num);
            scanf("%c", &c);
            while (num--)
            {
                int v;
                scanf("%c%d", &c, &v);
                havepar[v] = true;
                G[u].push_back(v);
            }
        }
        for (int i = 0; i < n; i++)
        {
            if (!havepar[i]) {
                dfs(i);
                Troot = i;
            }
        }
        printf("%d\n", min(dp[Troot][1], dp[Troot][0]));
    }
}
全部评论

相关推荐

来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
码农索隆:有点耳熟,你们是我教过最差的一届
点赞 评论 收藏
分享
CARLJOSEPH...:宝宝你戾气太大了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务