codeforces 814E An unavoidable detour for home
正解:$dp$。
感觉这道题就是中国象棋的加强版。。我们要发现一些性质。
首先就是这个图肯定是一个按照$bfs$序分层的图,且每个点只往自己上面那一层连了一条边,每个点不可能向自己的上面超过两层的点连边。
又因为$l_{i}\leq l_{i+1}$,所以实际上$bfs$序相同的点是连续的。
然后我们就可以$dp$了,设$f[i][a][b][c][d]$表示处理了前i个点,上一层还有a个点度数为1,b个点度数为2,这一层还有c个点度数为1,d个点度数为2。
然后我们直接转移就行了,转移就是对于当前点,枚举它的连边情况,它肯定会往上一层连一条边,同时也可能往自己这一层连边,剩下的边就留给下一层就行了。
最终答案就是$f[n][0][0][0][0]$。
#include <bits/stdc++.h>
#define il inline
#define RG register
#define ll long long
#define rhl (1000000007) using namespace std; int f[][][][][],du[],n;
//f[i][a][b][c][d]表示处理了前i个点,上一层还有a个点度数为1,b个点度数为2,这一层还有c个点度数为1,d个点度数为2 il int gi(){
RG int x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} il void add(RG int &x,RG int v){
x+=v; if (x>=rhl) x-=rhl; return;
} int main(){
#ifndef ONLINE_JUDGE
freopen("home.in","r",stdin);
freopen("home.out","w",stdout);
#endif
n=gi();
for (RG int i=;i<=n;++i) du[i]=gi();
f[][du[]==][du[]==][du[]==][du[]==]=;
for (RG int i=,pre=,cur=;i<n;++i,pre=cur,cur^=){
memset(f[pre],,sizeof(f[pre]));
for (RG int a=;a<=i;++a)
for (RG int b=;a+b<=i;++b)
for (RG int c=;a+b+c<=i;++c)
for (RG int d=,res;a+b+c+d<=i;++d){
res=f[cur][a][b][c][d]; if (!res) continue;
if (!a && !b){
if (c || d) add(f[cur][c][d][][],res); continue;
}
if (du[i+]==){
if (a){
add(f[pre][a-][b][c+][d],1LL*res*a%rhl);
if (c) add(f[pre][a-][b][c-][d],1LL*res*a*c%rhl);
if (d) add(f[pre][a-][b][c+][d-],1LL*res*a*d%rhl);
}
if (b){
add(f[pre][a+][b-][c+][d],1LL*res*b%rhl);
if (c) add(f[pre][a+][b-][c-][d],1LL*res*b*c%rhl);
if (d) add(f[pre][a+][b-][c+][d-],1LL*res*b*d%rhl);
}
} else{
if (a){
add(f[pre][a-][b][c][d+],1LL*res*a%rhl);
if (c) add(f[pre][a-][b][c][d],1LL*res*a*c%rhl);
if (d) add(f[pre][a-][b][c+][d-],1LL*res*a*d%rhl);
if (c && d) add(f[pre][a-][b][c][d-],1LL*res*a*c*d%rhl);
if (c>=) add(f[pre][a-][b][c-][d],1LL*res*(a*c*(c-)>>)%rhl);
if (d>=) add(f[pre][a-][b][c+][d-],1LL*res*(a*d*(d-)>>)%rhl);
}
if (b){
add(f[pre][a+][b-][c][d+],1LL*res*b%rhl);
if (c) add(f[pre][a+][b-][c][d],1LL*res*b*c%rhl);
if (d) add(f[pre][a+][b-][c+][d-],1LL*res*b*d%rhl);
if (c && d) add(f[pre][a+][b-][c][d-],1LL*res*b*c*d%rhl);
if (c>=) add(f[pre][a+][b-][c-][d],1LL*res*(b*c*(c-)>>)%rhl);
if (d>=) add(f[pre][a+][b-][c+][d-],1LL*res*(b*d*(d-)>>)%rhl);
}
}
}
}
cout<<f[n&][][][][]; return ;
}
codeforces 814E An unavoidable detour for home的更多相关文章
- An unavoidable detour for home CodeForces - 814E (dp)
大意: 给定一棵树每个点的度数, 求所有满足条件的树的个数 每个点到$1$的最短路唯一 假设$l_i$为点$i$到$1$的最短距离, 那么$l_i\ge l_{i-1}$ 每个点度数范围$2\le d ...
- CF814E An unavoidable detour for home
考虑有每个最短路只有一条. 那么我们建出最短路树后,显然所有的非树边都是同层之间的横叉边. 那么我们考虑设\(f(i,j,k,z)\)为我们考虑到了第\(i\)个点,此时他被我们分配到了\(p\)层, ...
- Work at DP
转载请注明出处:http://www.cnblogs.com/TSHugh/p/8858805.html Prepared: (无notes的波兰题目的notes见我的波兰题目补全计划)BZOJ #3 ...
- codeforces round 418 div2 补题 CF 814 A-E
A An abandoned sentiment from past 水题 #include<bits/stdc++.h> using namespace std; int a[300], ...
- codeforces814E
https://lunch.blog.luogu.org/cf814e-an-unavoidable-detour-for-homedp-ji-shuo-post https://blog.csdn. ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
随机推荐
- 实现 如 goole closure 类似功能模块加载函数
看过goole closure 的同学都知道 其中定义一个类名函数时候只要 inlude("") 想加载某个模块只要require("")就可以利用: ...
- Firebird Fluentdata
Fluentdata 支持很多种数据库驱动,但对Firebird不友好,不过可以使用DB2Provider来操作大部分功能, 例如: new DbContext().ConnectionString( ...
- 分布式事务-Sharding 数据库分库分表
Sharding (转)大型互联网站解决海量数据的常见策略 - - ITeye技术网站 阿里巴巴Cobar架构设计与实践 - 机械机电 - 道客巴巴 阿里分布式数据库服务原理与实践:沈询_文档下载 ...
- 第三章 使用java实现面向对象 多态
第三章 多态 一.编写父子类 1.多态是具有表现多种型生态的能力的特征,同一个实现接口,使用不同的实例而执行不同的操作 2.一个引用类型,使用不同的实例而执行不同操作.(父类引用子类对象) 使用多态的 ...
- 兼容ie6的ul水平居中对齐
---恢复内容开始--- margin可以为负数左移动. padding不可以. ---恢复内容结束---
- C#实现Javascript的Splice方法
最近开始学习Javascript语言,看到splice方法,以下引用其说明:该方法是一个通用删除和插入元素的方法,它可以在数组指定的位置开始删除或插入元素.其包括3个参数:第一个参数指定插入的起始位置 ...
- Linux 创建python虚拟环境
使用virtualenv包管理工具来管理虚拟环境 1.安装virtualenv 不知啥原因,第一次安装超时失败,第二次下载到30%超时失败,第三次才安装成功 2.创建虚拟环境 只有python2.7及 ...
- setInterval 与 clearInterval详解
首先注意,setInterval与clearInterval都是直属于window对象的. 1.直接调用setInterval(即不通过函数调用) <div id="oDiv_show ...
- console的一些方法
原文参考http://mp.weixin.qq.com/s?__biz=MzU3MDA0NTMzMA==&mid=2247485510&idx=2&sn=0adff5754a2 ...
- Django—自定义分页
分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置. 确定分页需求: 1. 每页显示的数据条数 2. 每页显示页号链接数 3. 上一页 ...