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 ...
随机推荐
- Java入门系列-23-NIO(使用缓冲区和通道对文件操作)
NIO 是什么 java.nio全称java non-blocking(非阻塞) IO(实际上是 new io),是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(bo ...
- dns dig 查看支持ipv6网站
1.处理zone文件 A.先格式化区文件数据,去掉不需要的数据,生成新的文件 com.zone.sample cat com.zone |grep -P IN'\t'NS|awk -F '\t' '{ ...
- java 并发(三)---Thread 线程
Thread 的状态 线程共有五种状态.分别是: (1)新建 (2)就绪 (3)运行 (4)阻塞 (5)死亡 ,下面列列举的状态需要结合状态示意图更好理解. 新建状态(New): 新创建了一个线程对 ...
- golang学习之beego增删改查代码实现
记录下使用beego的增删改查实现,数据库使用mysql,完整代码如下: package main import ( _ "crud_beego/routers" //自动注册路由 ...
- python----openpyxl模块
openpyxl 模块 1.openpyxl的写 from openpyxl import Workbook wb = Workbook() # 方式一: 默认创建sheet在最后 wb1 = wb. ...
- 【Android】11.0 UI开发(二)——列表控件ListView的简单实现1
************************ 转载请注明出处:https://www.cnblogs.com/xiaofu007/p/10342462.html ***************** ...
- web前端优化之内容优化
前端内容优化主要有以下几条: 1.尽量减少http请求 (1)合并文件,把多个css文件合并在一起: (2)css Sprites,把css相关的background元素进行背景图绝对定位: (3)图 ...
- C++类继承--继承后函数的值
类的继承会首先寻找基类,若基类未实现,则会寻找派生类的函数 1. class继承,函数不继承 #include <stdio.h> class Base { public: Base(){ ...
- Python 2 和Python 3的区别
print input urlopen print print在版本2的使用方法是: print 'this is version 2' 也可以是 print('this is version 2') ...
- Java 多线程使用
工作中遇到的问题,记录下解决的思路 问题: 对磁盘进行碎片化测试(比如说,磁盘空间是16G),从64K开始写文件,写满后删除一半,然后写32K 的数据,写满后删除一半...直到4K写满删除一般算是结束 ...