【bzoj1369】[Baltic2003]Gem 树形dp
题目描述
给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小。
输入
先给出一个数字N,代表树上有N个点,N<=10000 下面N-1行,代表两个点相连
输出
最小的总权值
样例输入
10 
7 5 
1 2 
1 7 
8 9 
4 1 
9 7 
5 6 
10 2 
9 3
样例输出
14
题解
树形dp
f[i][j]表示第i个点权值为j时i的子树的最小权值和。
一开始以为颜色数最多有n种,n^3的dp算法肯定是过不去,就算优化到n^2也还是会TLE。
然后网上有人说最多只会有logn种颜色。
虽然我证不出来,但感觉挺有道理,于是试了试,A了。
然而事实上经过测试,本题数据非常弱,最多也只有3种颜色,也就是直接循环到3即可。
好尴尬。
#include <cstdio>
#include <algorithm>
using namespace std;
int head[10010] , to[20010] , next[20010] , cnt , f[10010][18];
void add(int x , int y)
{
to[++cnt] = y;
next[cnt] = head[x];
head[x] = cnt;
}
void dp(int x , int fa)
{
int i , j , k;
for(i = 1 ; i <= 17 ; i ++ )
f[x][i] = i;
for(i = head[x] ; i ; i = next[i])
{
if(to[i] != fa)
{
dp(to[i] , x);
for(j = 1 ; j <= 17 ; j ++ )
{
int s = 0x7fffffff;
for(k = 1 ; k <= 17 ; k ++ )
if(j != k)
s = min(s , f[to[i]][k]);
f[x][j] += s;
}
}
}
}
int main()
{
int n , i , x , y , ans = 0x7fffffff;
scanf("%d" , &n);
for(i = 1 ; i < n ; i ++ )
scanf("%d%d" , &x , &y) , add(x , y) , add(y , x);
dp(1 , 0);
for(i = 1 ; i <= 17 ; i ++ )
ans = min(ans , f[1][i]);
printf("%d\n" , ans);
return 0;
}
【bzoj1369】[Baltic2003]Gem 树形dp的更多相关文章
- BZOJ1369:[Baltic2003]Gem(树形DP)
		
Description 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小. Input 先给出一个 ...
 - 【BZOJ-1369】Gem       树形DP
		
1369: [Baltic2003]Gem Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 282 Solved: 180[Submit][Status] ...
 - BZOJ 1369: [Baltic2003]Gem(树形dp)
		
传送门 解题思路 直接按奇偶层染色是错的,\(WA\)了好几次,所以要树形\(dp\),感觉最多\(log\)种颜色,不太会证. 代码 #include<iostream> #includ ...
 - BZOJ_1369_[Baltic2003]Gem_树形DP
		
BZOJ_1369_[Baltic2003]Gem_树形DP Description 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值, ...
 - BZOJ1369/LG4395 「BOI2003」Gem  树形DP
		
问题描述 LG4395 BZOJ1369 题解 发现对于结点 \(x\) ,其父亲,自己,和所有的孩子权值不同,共 \(3\) 类,从贪心的角度考虑,肯定是填 \(1,2,3\) 这三种. 于是套路树 ...
 - [bzoj1369][Baltic2003]Gem_树形dp_结论题
		
Gem bzoj-1369 Baltic-2003 题目大意:给你一棵树,让你往节点上添自然数,使得任意相邻节点的数不同且使得权值最小. 注释:n为结点个数,$1\le n\le 10^3$. 想法: ...
 - bzoj 1369: Gem 树形dp
		
题目大意 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小.N<=10000 题解 我们可以 ...
 - [BOI2003] Gem - 树形dp
		
结论 不同颜色数不会超过 \(O(\log n)\) 然后就是很简单的树形dp了 顺便复习一下树形dp怎么写 #include <bits/stdc++.h> using namespac ...
 - [bzoj1369] [Baltic2003]Gem
		
结论题...一棵树里用到的颜色数不超过logn.. f[i][j]表示以i为根的子树里,i的颜色是j的方案数. g[i][j]表示max{f[i][k]},(k!=j #include<cstd ...
 
随机推荐
- sas简单使用
			
1 数据存取: 逻辑库: libname 自己起的名字 ‘文件所在的路径’,若无这步数据则存在默认的work中. 另一个方法在sas里自己建立一个逻辑库,但是关闭后就消失了. 新建数据:data ...
 - BZOJ1003_物流运输_KEY
			
题目传送门 这是一道DP+最短路径的好题. 首先预处理每天每个点的最短路径. 用SPFA进行处理.即cost[i][j]为第i天到底j天的1到M点的最小花费. 就可以水水的DP. 设f[i]为第i天的 ...
 - 成都Uber优步司机奖励政策(3月22日)
			
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
 - 快速写一个babel插件
			
es6/7/8的出现,给我们带来了很多方便,但是浏览器并不怎么支持,目前chrome应该是支持率最高的,所以为了兼容我们只能把代码转成es5,这应该算是我们最初使用babel的一个缘由,随着业务的开发 ...
 - hdu5305 Friends(dfs,多校题)
			
Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
 - 第六章 高级I/O函数
			
第六章 高级I/O函数 6.1 pipe函数 即管道函数,用于进程间的通信. #include<unistd.h> int pipe(int fd[2]); // fd:filedes / ...
 - C if语句判断年龄
			
#include <stdio.h> int main(int argc, char **argv) { //新建两个变量给变量赋值跟初始化:const int a=45;int c=0; ...
 - (原) MaterialEditor部- UmateriaEditor中  Node编译过程和使用(3)
			
@author: 白袍小道 转载说明原处 插件同步在GITHUB: DaoZhang_XDZ 说明 1.本篇是接着-----(原) MaterialEditor部- UmateriaE ...
 - 【Python 开发】第二篇 :Python安装
			
一.python3.x安装 1)由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到. 官网:https://www.python.o ...
 - [2017 - 2018 ACL] 对话系统论文研究点整理
			
(论文编号及摘要见 [2017 ACL] 对话系统. [2018 ACL Long] 对话系统. 论文标题[]中最后的数字表示截止2019.1.21 google被引次数) 1. Domain Ada ...