题目链接

正解:$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的更多相关文章

  1. An unavoidable detour for home CodeForces - 814E (dp)

    大意: 给定一棵树每个点的度数, 求所有满足条件的树的个数 每个点到$1$的最短路唯一 假设$l_i$为点$i$到$1$的最短距离, 那么$l_i\ge l_{i-1}$ 每个点度数范围$2\le d ...

  2. CF814E An unavoidable detour for home

    考虑有每个最短路只有一条. 那么我们建出最短路树后,显然所有的非树边都是同层之间的横叉边. 那么我们考虑设\(f(i,j,k,z)\)为我们考虑到了第\(i\)个点,此时他被我们分配到了\(p\)层, ...

  3. Work at DP

    转载请注明出处:http://www.cnblogs.com/TSHugh/p/8858805.html Prepared: (无notes的波兰题目的notes见我的波兰题目补全计划)BZOJ #3 ...

  4. codeforces round 418 div2 补题 CF 814 A-E

    A An abandoned sentiment from past 水题 #include<bits/stdc++.h> using namespace std; int a[300], ...

  5. codeforces814E

    https://lunch.blog.luogu.org/cf814e-an-unavoidable-detour-for-homedp-ji-shuo-post https://blog.csdn. ...

  6. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  7. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  8. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  9. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

随机推荐

  1. linux下MySQL停止和重启

    一.启动方式1.使用linux命令service 启动:service mysqld start2.使用 mysqld 脚本启动:/etc/inint.d/mysqld start3.使用 safe_ ...

  2. whatwg-fetch

    fetch 是什么 XMLHttpRequest的最新替代技术 fetch优点 接口更简单.简洁,更加语义化 基于promise,更加好的流程化控制,可以不断then把参数传递,外加 async/aw ...

  3. ASP.NET Core中使用自定义路由

    上一篇文章<ASP.NET Core中使用默认MVC路由>提到了如何使用默认的MVC路由配置,通过这个配置,我们就可以把请求路由到Controller和Action,通常情况下我们使用默认 ...

  4. Go在windows10 64位上安装

    一.安装 1.下载安装包http://www.golangtc.com/download,这是国内的地址,也直接去官网下载. 2.选择适合自己的版本,这里我选择安64位装版go1.9.2.window ...

  5. 深入理解JavaScript系列(42):设计模式之原型模式

    介绍 原型模式(prototype)是指用原型实例指向创建对象的种类,并且通过拷贝这些原型创建新的对象. 正文 对于原型模式,我们可以利用JavaScript特有的原型继承特性去创建对象的方式,也就是 ...

  6. Razor 将C#对象转换成Javascript对象, json还原被转码的字符 &quot·· HTML转义符

    Razor 将C#对象转换成Javascript对象 在Razor中使用Json字符串,特殊字符被自动转义(如:\"->") @{ var jsonStr = Html.Ra ...

  7. No.5一步步学习vuejs之事件监听和组件

    一监听事件 可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码. <div id="demo1"> <button v-on ...

  8. spring下应用@Resource, @Autowired 和 @Inject注解进行依赖注入的差异

    为了探寻 '@Resource', '@Autowired', 和'@Inject'如何解决依赖注入中的问题,我创建了一个"Party"接口,和它的两个实现类"Perso ...

  9. 如何检测页面是否有重复的id属性值

    <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta nam ...

  10. vue-cli脚手架之其他文件解释

    好了,脚手架目录中重要的文件基本都介绍了,但还有一个不太注意到的文件没有解释,这里也说明一下. config文件夹下的index.js,作用是不同开发环境下的参数配置(可选项很多,生产环境.开发环境. ...