题目链接

正解:$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. HZAU 21——Arithmetic Sequence——————【暴力 or dp】

    Arithmetic Sequence Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1810  Solved: 311[Submit][Status] ...

  2. Golang教程:Map

    什么是 map? Map 是 Go 中的内置类型,它将键与值绑定到一起.可以通过键获取相应的值. 如何创建 map? 可以通过将键和值的类型传递给内置函数 make 来创建一个 map.语法为:mak ...

  3. jsp继承rapid库

    如果jsp不使用继承方式开发,而是用标准的指令或动作元素去include,实在是太多重复代码. rapid-framework是谷歌的一个项目,可以实现jsp网页的继承,也就是书写模板页. 但是在ma ...

  4. Silverlight & Blend动画设计系列九:动画(Animation)与视图状态管理(Visual State Manager)

    Silverlight中的动画(Animation)与视图状态管理(Visual State Manager) 结合使用是非常常见的,动画用于管理对象在某段事件段内执行的动画动作,视图状态管理则用于控 ...

  5. .Net Core GB2312编码问题

    1.今天抓取了一个网页的源代码.发现中文是乱码的,马上第一反应是编码问题..... 2.仔细一看基于WebClient写的代码,还真的是没有设置编码... /// <summary> // ...

  6. jquery.edatagrid(可编辑datagrid)的使用

    用spring+springmvc+mybatis+mysql实现简单的可编辑单元格,首先是页面效果图: 其中,“编号”列是不可编辑的,“暂缓措施”是可以自由编辑的,主要html组成: <%@ ...

  7. linux创建日期文件名

    linux创建文件名添加当前系统日期时间的方法 使用`date +%y%m%d` Example: mkdir `date +%y%m%d` tar cfvz /tmp/bak.`date +%y%m ...

  8. svn 创建本地仓库

    1. svnadmin create ~/repository 2. svnserve -d -r ~/repository 3. svn checkout file://~/repository $ ...

  9. Mybaits插入记录返回主键值

    某些情况进行insert时不知道主键值(主键为自增),例如系统新增用户时,有用户序号(主键 自增),用户名,密码.插入时只需插入用户名和密码,之后取得mysql自增的序号. 如下为mysql的usr表 ...

  10. linux sheel script demo

    demo1 (输入/输出) 1.1. target : 输入姓.名, 输出姓名 1.2. create directory mkdir ~/bin 1.3. create & edit she ...