[bzoj2466][中山市选2009]树_树形dp
树 bzoj-2466 中山市选-2009
题目大意:给定一棵树,每一个点有一个按钮和一个灯泡。如果按下一个点的按钮那么和这个点直接相连的点包括这个点的灯泡的状态会改变。如果是点亮就会变成熄灭,如果是熄灭就会变成点亮。
注释:$1\le n\le n$
想法:啥jb数据范围啊,不是树形dp吗?看着挺像高斯消元。看网上题解全是枚举自由元???O(n)就可以为什么要$O(n^3)$???
我们来看看树形dp...
状态:f[pos][bool]表示按下这个点的按钮之后,这个点亮(或不亮),它的所有子孙都亮的最小代价。g[pos][bool]表示不按这个点的按钮,这个点亮(不亮),它的所有子孙都亮的方案数。
转移:
f[pos][1]=min(f[pos][0] + f[to[i]][0] , f[pos][1] + g[to[i]][0]).
f[pos][0]=min(f[pos][0] + g[to[i]][0] , f[pos][1] + f[to[i]][0]).
g[pos][1]=min(g[pos][0] + f[to[i]][1] , g[pos][1] + g[to[i]][1]).
g[pos][0]=min(g[pos][0] + g[to[i]][1] , g[pos][1] + f[to[i]][1]).
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 110
using namespace std;
int to[N<<1],nxt[N<<1],head[N],tot;
int f[N][5],g[N][5],n;
inline void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int pos,int fa)
{
f[pos][1]=1,f[pos][0]=n<<1;
g[pos][0]=0,g[pos][1]=n<<1;
for(int i=head[pos];i;i=nxt[i])
{
if(to[i]==fa) continue;
dfs(to[i],pos);
int f1=f[pos][1],f0=f[pos][0],g1=g[pos][1],g0=g[pos][0];
f[pos][1]=min(f0+f[to[i]][0],f1+g[to[i]][0]);
f[pos][0]=min(f0+g[to[i]][0],f1+f[to[i]][0]);
g[pos][1]=min(g0+f[to[i]][1],g1+g[to[i]][1]);
g[pos][0]=min(g0+g[to[i]][1],g1+f[to[i]][1]);
}
}
void original()
{
tot=0;
memset(head,0,sizeof head);
}
int main()
{
while(~scanf("%d",&n))
{
if(!n) return 0;
original();
for(int x,y,i=1;i<=n-1;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x);
dfs(1,0);
printf("%d\n",min(f[1][1],g[1][1]));
}
}
小结:觉得树形dp很强啊... ...
[bzoj2466][中山市选2009]树_树形dp的更多相关文章
- bzoj2466: [中山市选2009]树
同上一题.(应该可以树形dp,然而我不会... #include<cstdio> #include<cstring> #include<iostream> #inc ...
- 【dfs】【高斯消元】【异或方程组】bzoj1770 [Usaco2009 Nov]lights 燈 / bzoj2466 [中山市选2009]树
经典的开关灯问题. 高斯消元后矩阵对角线B[i][i]若是0,则第i个未知数是自由元(S个),它们可以任意取值,而让非自由元顺应它们,得到2S组解. 枚举自由元取0/1,最终得到最优解. 不知为何正着 ...
- 【BZOJ2466】[中山市选2009]树 树形DP
[BZOJ2466][中山市选2009]树 Description 图论中的树为一个无环的无向图.给定一棵树,每个节点有一盏指示灯和一个按钮.如果节点的按扭被按了,那么该节点的灯会从熄灭变为点亮(当按 ...
- BZOJ 2466: [中山市选2009]树( 高斯消元 )
高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... ------------------------------------------------------------- ...
- [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp
品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...
- BZOJ 2466: [中山市选2009]树
Sol 树形DP. 听说有非常神奇的高斯消元的做法...orz... 然而我只会 \(O(n)\) 的树形DP. 首先一个点的状态只于他的父节点和子树有关,跟他 子树的子树 和 父亲的父亲 都没有任何 ...
- BZOJ 2466 [中山市选2009]树(高斯消元)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2466 [题目大意] 给定一棵树,每个节点有一盏指示灯和一个按钮.如果节点的按扭被按了, ...
- 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组
[题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...
- BZOJ 2466 中山市选2009 树 高斯消元+暴力
题目大意:树上拉灯游戏 高斯消元解异或方程组,对于全部的自由元暴力2^n枚举状态,代入计算 这做法真是一点也不优雅... #include <cstdio> #include <cs ...
随机推荐
- 动态规划---区间dp
今天写内网题,连着写了两道区间dp,这里就总结一下. 区间dp思想主要是先枚举f[i][j]中的i,再枚举j,再枚举一个1~j之间的变量k,一般是f[i][j] = max(f[i][j],f[i][ ...
- (Go)09.指针赋值修改示例
答案: 1 package main 2 import ( 3 "fmt" 4 ) 5 6 7 func modify(p *int) { 8 fmt.Println(p) 9 ...
- 前端常见面试题总结part2
今天总结了几道,感觉非常有意思的题,有感兴趣的可以看下,有疑问请留言~ (答案在最后) 考察自执行函数的this指向 审题要细心 var n = 2, obj = { n:2, fn:(functio ...
- Linux之tar.gz file
A tarball (tar.gz file) is compressed tar archive. The tar program provides the ability to create ta ...
- MSP430之software development flow
MSP430 software development flow. 1) The shaded portion highlights the most common development path; ...
- Windows下使用Caffe-Resnet
参考文章: 编译历程参考:CNN:Windows下编译使用Caffe和Caffe2 caffe的VS版本源代码直接保留了sample里面的shell命令,当然这些shell命令在Windows平台下是 ...
- Architecture:话说科学家/工程师/设计师/商人
从使命.目的.行为的不同,可以归类人群到科学家.工程师.设计师.商人等等.使命分别是:1.携带当下社会的财富对未来探索,希望引发变革:2.掌握工程全貌.完成整个工程的圣经周期:3.在工程的设计层面做文 ...
- GET 请求控制器 返回绑定后HTML
//$.get("/Home/index/" + $("#S_BookName").val(), function (data) { //MVC控制器返回Vie ...
- LA 3363
Run Length Encoding(RLE) is a simple form of compression. RLE consists of the process for searching ...
- eslint 校验去除
不允许对 function 的参数进行重新赋值 /* eslint no-param-reassign: ["error", { "props": false ...