• P2899 [USACO08JAN]Cell Phone Network G



    这是一个很经典的树形dp
    其实还是很有难度的
    dp[u][0]表示u节点一定被自己点亮
    dp[u][1]表示u节点一定被父亲点亮
    dp[u][2]表示u节点一定被儿子点亮

    注意这里的“一定”表示:
    比如dp[u][1]表示一定u的父亲是亮的,但是不排除u是亮的或者u的儿子是亮的

    尽管这里有个状态是dp[u][1]被父亲点亮,但是我们任就从下往上进行转移,是不影响的

    被自己点亮,儿子三种情况都可行的
    dp[u][0]+=min(dp[v][1],dp[v][0],dp[v][2])

    被父亲点亮,那儿子可以是自己亮或者被儿子的儿子点亮
    dp[u][1]+=min(dp[v][0],dp[v][2])

    被儿子点亮,这种情况是最麻烦的
    首先我们一定要满足一个儿子是被自己点亮的,再其次剩下的儿子可以选择自己亮或者被自己儿子点亮
    转移过程:
    先假设每个儿子都自己亮,再维护一个数组(儿子的儿子亮-儿子自己亮)
    从小到大进行排序
    如果
    儿子的儿子亮-儿子自己亮<0 也就是 儿子的儿子亮<儿子自己亮,更新dp[u][1],就是让原来儿子自己亮着的状态换成儿子的儿子亮着的状态
    如果
    儿子的儿子亮-儿子自己亮>0 也就是 儿子的儿子亮>儿子自己亮,此时就让儿子自己亮着就好
    因为要保证只要有一个儿子,维护的最后一个一定是让儿子自己亮着的最优解

    点击查看代码
    #include<bits/stdc++.h>
    using namespace std;
    #define lowbit(x) x&(-x)
    #define ll long long
    #define inf 10005
    const int maxn=1e4+5;
    int n;
    int dp[maxn][3];
    vector<int>Q[maxn];
    void dfs(int u,int fa);
    int main(){
    	scanf("%d",&n);
    	for(int aa,bb,i=1;i<n;i++){
    		scanf("%d%d",&aa,&bb);
    		Q[aa].push_back(bb);
    		Q[bb].push_back(aa);
    	}
    	dfs(1,1);
    	cout<<min(dp[1][0],dp[1][2])<<endl;
         return 0;
    }
    //0--->自己 1--->父亲 2--->儿子 
     
    void dfs(int u,int fa){
    	dp[u][0]=1;
    	multiset<int>T;
    	multiset<int>::iterator id ,ed;
    	for(int i=0;i<Q[u].size();i++){
    		int to=Q[u][i];
    		if(to==fa)continue;
    		dfs(to,u);
    		dp[u][0]+=min(dp[to][0],min(dp[to][1],dp[to][2]));
    		dp[u][1]+=min(dp[to][0],dp[to][2]);
    		dp[u][2]+=dp[to][0];
    		T.insert(dp[to][2]-dp[to][0]); 
    		}
    		if(T.empty())
    		dp[u][2]=inf;
    		else {
    			id=T.begin();ed=T.end();ed-- ;
    		for(;id!=ed;id++){
    			if(*id<0)dp[u][2]+=*id;
    			else break;
    		}
    		}
    }
    
  • 相关阅读:
    语音
    elasticsearch-HQ 安装与使用
    身份证号归属地数据库
    mysql 检查一个字符串是不是身份证号
    导出微信聊天记录并生成词云
    云平台Linux主机安装流程
    7za的压缩与解压
    把linux文件夹压缩成tar.gz的命令
    Python中包(package)的调用方式
    golang学习笔记 ----读写文件
  • 原文地址:https://www.cnblogs.com/wzxbeliever/p/16062235.html
Copyright © 2020-2023  润新知