• 战略游戏


    https://loj.ac/problem/10156

    dp[i][0/1]表示以i为根的子树中,当i放(1)与不放(0)时最少放几个

    由题意,树枝两端至少有一个放的,即父亲不放,所有儿子必须放;父亲放了,儿子放不放都行

    注意从0开始编号

    #include<bits/stdc++.h>
    using namespace std;
    int cnt[5000],dp[5000][3],son[5000][5000],fa[5000];
    void dfs(int root)
    {
    	if(!cnt[root]) 
    	{
    		dp[root][0]=0;
    		dp[root][1]=1;
    		return;
    	}
    	for(int i=0;i<cnt[root];i++)
    	dfs(son[root][i]);
    	dp[root][1]=1;
    	int f=0;
    	for(int i=0;i<cnt[root];i++)
    	{
    		dp[root][1]+=min(dp[son[root][i]][0],dp[son[root][i]][1]);
    		dp[root][0]+=dp[son[root][i]][1];
    	}
    	
    }
    int main()
    {
    	int n,x;
    	cin>>n;
    	for(int i=0;i<n;i++)
    	{
    		cin>>x;
    		cin>>cnt[x];
    		for(int j=0;j<cnt[x];j++)
    		{
    			cin>>son[x][j];
    			fa[son[x][j]]=x;
    		}
    	}
    	for(int i=0;i<n;i++)
    	{
    		if(!fa[i]) 
    		{
    			dfs(i);	
    			cout<<min(dp[i][0],dp[i][1]);
    			break;
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    线段树
    哈希,hash
    单调栈
    树的重心
    背包问题
    最小生成树
    二分图匹配
    题解 P6355 [COCI2007-2008#3] DEJAVU
    题解 P6745 『MdOI R3』Number
    题解 P2080 增进感情
  • 原文地址:https://www.cnblogs.com/qwq-/p/13569330.html
Copyright © 2020-2023  润新知