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 ...
随机推荐
- WPF整理-使用逻辑资源
"Traditional application resources consist of binary chunks of data, typically representing thi ...
- monkey命令
介绍: monkey是一个命令行工具,可以运行在Android模拟器里或真实设备中.它可以向系统发送伪随机(pseudo-random)的用户事件流(如按键输入.触摸屏输入.手势输入等),可以对待测的 ...
- iOS AutoLayout自动布局&Masonry介绍与使用实践
Masonry介绍与使用实践:快速上手Autolayout http://www.cnblogs.com/xiaofeixiang/p/5127825.html http://www.cocoachi ...
- as3绕过策略文件给视频截图
接上篇 http://www.cnblogs.com/DarkMaster/p/5973593.html 这篇同样是在老外博客上找到的,分享给大家,再次感叹老外牛逼啊. 原文地址:http://gam ...
- 级联两个bootstrap-table。一张表显示相关的数据,通过点击这张表的某一行,传过去对应的ID,刷新另外一张表。
二张表的代码(我用的插件,大家可以去网上直接下载http://issues.wenzhixin.net.cn/bootstrap-table/): <div class="contai ...
- 来杯Caffe——在ubuntu下安装Caffe框架并测试
Caffe是一种深度学习框架...blablabla...... Caffe要在ubuntu下安装 1. 安装依赖 sudo apt-get install libatlas-base-dev sud ...
- Python开发程序:RPC异步执行命令(RabbitMQ双向通信)
RPC异步执行命令 需求: 利用RibbitMQ进行数据交互 可以对多台服务器进行操作 执行命令后不等待命令的执行结果,而是直接让输入下一条命令,结果出来后自动打印 实现异步操作 不懂rpc的请移步h ...
- python pip安装问题
scipy-0.18.1-cp34-cp34m-win32.whl is not a supported wheel on this platform. 遇到该问题需要更新pip版本 1.更新pip: ...
- SpringMVC常用配置-添加静态资源处理器-针对SpringMVC中静态资源无法访问的问题
- Android下Cocos2d创建HelloWorld工程
最近在搭建Cocos2d的环境,结果各种问题,两人弄了一天才能搞好一个环境-! -_-!! 避免大家也可能会遇到我这种情况,所以写一个随笔,让大家也了解下如何搭建吧- 1.环境安装准备 下载 tadp ...