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 ...
随机推荐
- 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-2 工程及程序构架介绍
视频简介: 该视频介绍iCore3应用开发平台出厂源代码中ARM部分程序构架. 源视频包下载地址: http://pan.baidu.com/s/1jHGnc7k 银杏科技优酷视频发布区: htt ...
- 美萍超市销售管理系统标准版access数据库密码mp611
美萍超市销售管理系统标准版access数据库密码mp611 作者:admin 来源:本站 发表时间:2015-10-14 19:01:43 点击:199 美萍超市销售管理系统标准版access后 ...
- web系统访问频率限制
无论是spring mvc还是struts,都可以为controller或者aciton执行前,增加拦截器. 通过拦截器中的逻辑控制,可以实现访问频率的限制. 首先构造访问频率数据类 class Fr ...
- 20145220&20145209&20145309信息安全系统设计基础实验报告(4)
20145220&20145209&20145309信息安全系统设计基础实验报告(4) 实验报告链接: http://www.cnblogs.com/zym0728/p/6132246 ...
- 1.Maven的安装以及本地仓库的配置
安装: maven下载地址:http://maven.apache.org/release-notes-all.html 然后解压,配置环境变量 MAVEN_HOME,并添加到path中.验证是否 ...
- grafana + influxdb + telegraf , 构建性能监控平台
1.安装平台 1).grafana , 访问各类数据源 , 自定义报表.显示图表等等 , 用于提供界面监控 , 默认端口为3000 , 默认登陆信息admin wget https://grafana ...
- 关于CLR、CIL、CTS、CLS、CLI、BCL和FCL
如果要想深入学习.NET平台,那么标题中的这些关键字对你来说并不陌生,这些名词构成了.NET庞大的生态系统,为了宏观认识.NET平台,学些.NET架构体系,针对一些常用常用名词的理解是很有必要的,未必 ...
- iOS导航栏的正确隐藏方式【转】
简介:在项目中经常碰到首页顶部是无限轮播,需要靠最上面显示.有的设置导航栏为透明等一系列的方法,这个可以借助第三方.或者干脆简单粗暴的直接隐藏掉导航栏.可是push到下一个页面的时候是需要导航栏的,如 ...
- 使用TreeView 使用多选功能
1.要用TreeView多选就要显示复选框,TreeView默认不显示复选框,显示复选框: TreeView2.ShowCheckBoxes = TreeNodeTypes.All; 初始化TreeV ...
- 常用prototype函数
$("spcode").value --取得当前页面的值的value,可以赋值 $F('spcode') --不能赋值 $!spcode - ...