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 ...
随机推荐
- 忘记root密码的解决方法——进入单用户模式修改
(1)在系统还在读秒的时候按任意键,你会看到如下界面: 然后按下‘e’
- Golang教程:并发介绍
Go是并发语言,而不是并行语言.在讨论Go并发性之前,我们必须首先了解什么是并发,以及并发与并行的区别. 什么是并发 并发(concurrency)是指一次处理大量事情的能力.让我们用一个例子来说明. ...
- 正排索引(forward index)与倒排索引(inverted index)
正常的索引一般是指关系型数据库里的索引. 把不同的数据存放到不同的字段中.如果要实现baidu或google那种搜索,就需要与一条记录的多个字段进行比对,需要 全表扫描,如果数据量比较大的话,性能就很 ...
- 资料汇总--Web前端
01.前端技能汇总 02.gitHub优秀前端资料分享 03.大前端 HTML Doctype作用?严格模式与混杂模式如何区分?它们有何意义? 1. <!DOCTYPE> 声明位于文档中的 ...
- js跳转指定的网站
$(function () {window.location.replace("http:new.mingyikanya.com");});
- button小手设置 css的cursor
需要对元素的css属性cursor进行设置.cursor可能的值: default 默认(通常是一个箭头) auto 默认.浏览器设置的光标 crosshair 十字线形状. pointer 小手形状 ...
- Win10自带Ubuntu子系统下Mysql安装踩坑记录
linux系统为win10自带Ubuntu子系统 错误的安装过程 我按照一般的方法安装mysql,安装步骤如下 1.升级源 $ sudo apt-get update 2.安装mysql $ sudo ...
- orderby与groupby同时使用
两个同时使用:要求排序其他字段 select c1,max(c2) as a from table group by c1 order by a; in查询按照排序结果: ,,,....)
- Android - 内存泄漏的情况以及解决方法
[译]Android内存泄漏的八种可能(上) Android防止内存泄漏的八种方法(下). Static Activities 在类中定义了静态Activity变量,把当前运行的Activity实例赋 ...
- csharp:Convert Image to Base64 String and Base64 String to Image
/// <summary> /// 图像转成二进制数组 /// </summary> /// <param name="imageIn">< ...