2013ACM/ICPC亚洲区南京站现场赛-HDU4809(树形DP)
为了这个题解第一次写东西。。(我只是来膜拜爱看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)的更多相关文章
- 2013ACM/ICPC亚洲区南京站现场赛---Poor Warehouse Keeper(贪心)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4803 Problem Description Jenny is a warehouse keeper. ...
- 2013ACM/ICPC亚洲区南京站现场赛——题目重现
GPA http://acm.hdu.edu.cn/showproblem.php?pid=4802 签到题,输入两个表,注意细心点就行了. #include<cstdio> #inclu ...
- hdu4811-Ball(2013ACM/ICPC亚洲区南京站现场赛)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4811 题目描述: Problem Description Jenny likes balls. He ...
- 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)
摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...
- 2016ACM/ICPC亚洲区大连站现场赛题解报告(转)
http://blog.csdn.net/queuelovestack/article/details/53055418 下午重现了一下大连赛区的比赛,感觉有点神奇,重现时居然改了现场赛的数据范围,原 ...
- 2013ACM-ICPC亚洲区南京站现场赛G题
题目大意:一个n维的系统中随机选一个向量(X1,X2,X3,...,Xn),其中0<=Xi<=R,且X1^2+X2^2+X3^2+……+Xn^2 <= R^2. 现在给定n,R.求X ...
- 2014ACM/ICPC亚洲区西安站现场赛 F color(二项式反演)
题意:小球排成一排,从m种颜色中选取k种颜色给n个球上色,要求相邻的球的颜色不同,求可行的方案数,答案模1e9+7.T组数据,1<= n, m <= 1e9, 1 <= k < ...
- HDU 6227.Rabbits-规律 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))
Rabbits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total S ...
- HDU 6225.Little Boxes-大数加法 (2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学))
整理代码... Little Boxes Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/O ...
随机推荐
- webservice总结
webservice xml(DTD,Schema,Stax) SOAP jax-ws (java api xml webservice) 契约优先的开发模式 CXF Rest 异构平台之间的交互(. ...
- PHP AJAX JSONP实现跨域请求使用实例
在之前我写过“php返回json数据简单实例”,“php返回json数据中文显示的问题”和“在PHP语言中使用JSON和将json还原成数组”.有兴趣的童鞋可以看看 今天我写的是PHP AJAX JS ...
- sublime work flow
Tools -> Developer -> New Snippet <snippet> <content><![CDATA[ }() { ${} } ]]&g ...
- Sharepoint client model 中出现Cannot invoke HTTP DAV request. There is a pending query 的解决办法
由于近期在某项目中使用sharepoint client 对象模型做项目 在sharepoint 2010环境下正常,但迁移到sharepoint 2013后报错,提示如下 Cannot invoke ...
- jquety
.html() //能够获取元素里的内容包括标签: .text() //只能获取到元素里的内容 .val() //可以得到元素的value值 $(this).index() //得到点时间发生的 ...
- jquery in confluence.
https://confluence.atlassian.com/confkb/how-to-use-javascript-in-confluence-313458839.html https://a ...
- Win10 锁屏图片 路径
Win10锁屏图片非常漂亮,下面是获得这些图片的方法: 一. 找到这个路径 C:\Users\UserName\AppData\Local\Packages\Microsoft.Windows.Con ...
- kaggle实战记录 =>Digit Recognizer
date:2016-09-13 今天开始注册了kaggle,从digit recognizer开始学习, 由于是第一个案例对于整个流程目前我还不够了解,首先了解大神是怎么运行怎么构思,然后模仿.这样的 ...
- Another MySQL daemon already running with the same unix socket的解决
问题出现: 每周一需要备份一次数据库,即从服务器MySQL导出sql文件,再导入到我机器上虚拟机的MySQL里.但是今天早上连不上,我进入控制台用#service mysqld start强行启动,报 ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍
RDIFramework.NET ━ .NET快速信息化系统开发框架 工作流程组件介绍 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部 ...