为了这个题解第一次写东西。。(我只是来膜拜爱看touhou的出题人的)..

首先以为对称性质。。我们求出露琪诺的魔法值的期望就可以了。。之后乘以3就是答案。。(话说她那么笨。。能算出来么。。⑨⑨⑨⑨⑨⑨)

用dp表示方法数。。。

首先状态如此表示: 设dp(i,j,k)其中i代表节点的标号。。j代表状态(就像官方题解一样..0表示这个颜色不选,1代表选而且和子节点形成的联通块的节点数是奇数,2代表偶数)。。。k代表x-y的值。。

这样的话。。递推方程就能推咯。。然后慢慢把子节点dfs出来后加到根节点上面比如u是跟。v是儿子的话。。那么

dp[u][0][val] = dp[u][0][x]*dp[v][0][y] + dp[u][0][x]*dp[v][1][y-1] + dp[u][0][x]*dp[v][2][y+1] 。。。。。。。。。。。。。。(x+y = val)

dp[u][1][val] = dp[u][1][x]*dp[v][0][y] + dp[u][1][x]*dp[u][2][y] + dp[u][2][x]*dp[v][1][y]

dp[u][1][val] = dp[u][2][x]*dp[v][0][y] + dp[u][1][x]*dp[u][1][y] + dp[u][2][x]*dp[v][2][y]

至此。。这道题目基本就可以解决了。。其实还是有一些细节的(为什么有人跑的那么快。。我的却那么慢。。果然还是我太水了。。)

 #include <iostream>   //我是沙茶....今天又写搓了。。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <climits>
#include <ctime>
#include <cmath>
#include <set>
#include <map>
#include <string>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):(-(x)))
#define FOR(i,a,b) for(int i = (a);i<=(b);i++)
#define FORD(i,a,b) for(int i = (a);i>=(b);i--)
#define REP(i,n) for(int i = 0;i<(n);i++)
#define rst(x,k) memset(x,k,sizeof(x))
#define lowbit(x) ((x)&(-(x)))
#define h(x) (1<<(x))
#define lson (ind<<1)
#define rson (ind<<1|1)
#define eps 1e-6
#define maxn 480
#define INF 1000000000
#define mod 1000000007LL
#define base 160
#define link fsafsdfas
using namespace std;
typedef long long LL;
struct node{
int t,nxt;
}edge[maxn<<];
int headline[maxn],E;
void add(int f,int t){
edge[E].t = t;
edge[E].nxt = headline[f];
headline[f] = E++;
}
LL dp[][][];
LL tt[][][];
int n;
int high[],low[];
int up,down;
void dfs(int u,int fa){
dp[u][][base] = ;
dp[u][][base] = ;
high[u] = low[u] = ;
for(int i = headline[u];~i;i = edge[i].nxt){
int v = edge[i].t; if(v == fa)continue;
dfs(v,u);rst(tt[u],);
FOR(p,low[u],high[u]){ //这种优化不太好。。如果谁有更快的优化方法求给蒟蒻说一下哈。。
FOR(q,low[v]-,high[v]+){
if((p+q > n) || (p+q < (-n)/-))continue;
tt[u][][p+q+base] += dp[u][][p+base]*dp[v][][q+base] + dp[u][][p+base]*dp[v][][q+base-] + dp[u][][p+base]*dp[v][][q+base+];
tt[u][][p+q+base] += dp[u][][p+base]*dp[v][][q+base] + dp[u][][p+base]*dp[v][][q+base] + dp[u][][p+base]*dp[v][][q+base];
tt[u][][p+q+base] += dp[u][][p+base]*dp[v][][q+base] + dp[u][][p+base]*dp[v][][q+base] + dp[u][][p+base]*dp[v][][q+base];
tt[u][][p+q+base] %= mod; if(tt[u][][p+q+base] && p+q > high[u]) high[u] = p+q; if(tt[u][][p+q+base] && p+q < low[u])low[u] = p+q;
tt[u][][p+q+base] %= mod; if(tt[u][][p+q+base] && p+q > high[u]) high[u] = p+q; if(tt[u][][p+q+base] && p+q < low[u])low[u] = p+q;
tt[u][][p+q+base] %= mod; if(tt[u][][p+q+base] && p+q > high[u]) high[u] = p+q; if(tt[u][][p+q+base] && p+q < low[u])low[u] = p+q;
}
}
FOR(j,low[u],high[u]){
dp[u][][j+base] = tt[u][][j+base];
dp[u][][j+base] = tt[u][][j+base];
dp[u][][j+base] = tt[u][][j+base];
}
}
} void solve(){
rst(headline,-); E = ;
rst(dp,);
REP(i,n-){
int a,b; scanf("%d%d",&a,&b);
add(a,b); add(b,a);
}
up = n; down = -n/-;
dfs(,);
LL ans = ;
FOR(i,-,up){
ans += dp[][][i+base]*(MAX(i,))%mod;
ans += dp[][][i+base]*(MAX(i+,))%mod;
ans += dp[][][i+base]*(MAX(i-,))%mod;
ans %= mod;
}
printf("%I64d\n",ans*%mod);
}
int main(void){
while(EOF != scanf("%d",&n))solve();
return ;
}

2013ACM/ICPC亚洲区南京站现场赛-HDU4809(树形DP)的更多相关文章

  1. 2013ACM/ICPC亚洲区南京站现场赛---Poor Warehouse Keeper(贪心)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4803 Problem Description Jenny is a warehouse keeper. ...

  2. 2013ACM/ICPC亚洲区南京站现场赛——题目重现

    GPA http://acm.hdu.edu.cn/showproblem.php?pid=4802 签到题,输入两个表,注意细心点就行了. #include<cstdio> #inclu ...

  3. hdu4811-Ball(2013ACM/ICPC亚洲区南京站现场赛)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4811 题目描述: Problem Description Jenny likes balls. He ...

  4. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  5. 2016ACM/ICPC亚洲区大连站现场赛题解报告(转)

    http://blog.csdn.net/queuelovestack/article/details/53055418 下午重现了一下大连赛区的比赛,感觉有点神奇,重现时居然改了现场赛的数据范围,原 ...

  6. 2013ACM-ICPC亚洲区南京站现场赛G题

    题目大意:一个n维的系统中随机选一个向量(X1,X2,X3,...,Xn),其中0<=Xi<=R,且X1^2+X2^2+X3^2+……+Xn^2 <= R^2. 现在给定n,R.求X ...

  7. 2014ACM/ICPC亚洲区西安站现场赛 F color(二项式反演)

    题意:小球排成一排,从m种颜色中选取k种颜色给n个球上色,要求相邻的球的颜色不同,求可行的方案数,答案模1e9+7.T组数据,1<= n, m <= 1e9, 1 <= k < ...

  8. HDU 6227.Rabbits-规律 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))

    Rabbits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...

  9. HDU 6225.Little Boxes-大数加法 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))

    整理代码... Little Boxes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/O ...

随机推荐

  1. SQLite的原子提交原理

    本文描述了sqlite为保证数据库文件不被损坏而采取的种种手段.. 以下是原译者的摘要:http://www.kuqin.com/shuoit/20150618/346693.html 摘要: 本文源 ...

  2. iOS TTF文件使用---改变字体

    TTF(True Type Font):是一种字库名称 TTF文件:是Apple公司和Microsoft公司共同推出的字体文件格式 使用: 1 获取字体文件 从各种渠道下载字体ttf,网站或从别的ip ...

  3. 影响前端的Chrome浏览器36

    新发现,在我开发过的组件中表格组件是采用Table生成的,而在Webkit内核浏览器中,Table的列顺序是倒着生成的,所以在组件中要做兼容. 现在Chrome浏览器版本已经升级到36了.发现Tabl ...

  4. 【emWin】例程六:设置颜色

    实验指导书及代码包下载: 链接:http://pan.baidu.com/s/1eSidREy 密码:ru3c 实验现象:

  5. vm安装centos 老是出现 grub.conf 配置问题

    vm 环境 11  centos 6.5 最开始用的是vm12 发现安装软件一会就出现 客户机操作系统已禁用 cpu.请关闭或重置虚拟机 以为是新机器的cpu或者主板有问题,换vm,换系统依然会出现这 ...

  6. 总结-html

    页面尺寸: var w = document.body.scrollWidth; (w + "px")var h = document.body.scrollHeight; (h ...

  7. hadoop2.7下载mirror

    http://mirror.bit.edu.cn/apache/hadoop/common/

  8. js按键监听

    //回车键监听 function keypressed(){ if(event.keyCode == 13) { doAction(); } } document.onkeydown = keypre ...

  9. java中分页效果的实现代码

    首先是将分页所需的一些个资源 ,抽象出一个javabean对象-PageBean: 先把需要分页的数据或是记录都查询出来 存入一个集合类里如List或是Vector, 然后利用其sublist(int ...

  10. wamp下多域名配置问题

    1.找到wamp安装目录的apache安装目录 找到 httpd.conf文件 例如我安装的目录为 E:\wamp\bin\apache\apache2.2.8\conf\httpd.conf 也可以 ...