题目链接

正解:$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]$。

  1. #include <bits/stdc++.h>
  2. #define il inline
  3. #define RG register
  4. #define ll long long
  5. #define rhl (1000000007)
  6.  
  7. using namespace std;
  8.  
  9. int f[][][][][],du[],n;
  10. //f[i][a][b][c][d]表示处理了前i个点,上一层还有a个点度数为1,b个点度数为2,这一层还有c个点度数为1,d个点度数为2
  11.  
  12. il int gi(){
  13. RG int x=,q=; RG char ch=getchar();
  14. while ((ch<'' || ch>'') && ch!='-') ch=getchar();
  15. if (ch=='-') q=-,ch=getchar();
  16. while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
  17. return q*x;
  18. }
  19.  
  20. il void add(RG int &x,RG int v){
  21. x+=v; if (x>=rhl) x-=rhl; return;
  22. }
  23.  
  24. int main(){
  25. #ifndef ONLINE_JUDGE
  26. freopen("home.in","r",stdin);
  27. freopen("home.out","w",stdout);
  28. #endif
  29. n=gi();
  30. for (RG int i=;i<=n;++i) du[i]=gi();
  31. f[][du[]==][du[]==][du[]==][du[]==]=;
  32. for (RG int i=,pre=,cur=;i<n;++i,pre=cur,cur^=){
  33. memset(f[pre],,sizeof(f[pre]));
  34. for (RG int a=;a<=i;++a)
  35. for (RG int b=;a+b<=i;++b)
  36. for (RG int c=;a+b+c<=i;++c)
  37. for (RG int d=,res;a+b+c+d<=i;++d){
  38. res=f[cur][a][b][c][d]; if (!res) continue;
  39. if (!a && !b){
  40. if (c || d) add(f[cur][c][d][][],res); continue;
  41. }
  42. if (du[i+]==){
  43. if (a){
  44. add(f[pre][a-][b][c+][d],1LL*res*a%rhl);
  45. if (c) add(f[pre][a-][b][c-][d],1LL*res*a*c%rhl);
  46. if (d) add(f[pre][a-][b][c+][d-],1LL*res*a*d%rhl);
  47. }
  48. if (b){
  49. add(f[pre][a+][b-][c+][d],1LL*res*b%rhl);
  50. if (c) add(f[pre][a+][b-][c-][d],1LL*res*b*c%rhl);
  51. if (d) add(f[pre][a+][b-][c+][d-],1LL*res*b*d%rhl);
  52. }
  53. } else{
  54. if (a){
  55. add(f[pre][a-][b][c][d+],1LL*res*a%rhl);
  56. if (c) add(f[pre][a-][b][c][d],1LL*res*a*c%rhl);
  57. if (d) add(f[pre][a-][b][c+][d-],1LL*res*a*d%rhl);
  58. if (c && d) add(f[pre][a-][b][c][d-],1LL*res*a*c*d%rhl);
  59. if (c>=) add(f[pre][a-][b][c-][d],1LL*res*(a*c*(c-)>>)%rhl);
  60. if (d>=) add(f[pre][a-][b][c+][d-],1LL*res*(a*d*(d-)>>)%rhl);
  61. }
  62. if (b){
  63. add(f[pre][a+][b-][c][d+],1LL*res*b%rhl);
  64. if (c) add(f[pre][a+][b-][c][d],1LL*res*b*c%rhl);
  65. if (d) add(f[pre][a+][b-][c+][d-],1LL*res*b*d%rhl);
  66. if (c && d) add(f[pre][a+][b-][c][d-],1LL*res*b*c*d%rhl);
  67. if (c>=) add(f[pre][a+][b-][c-][d],1LL*res*(b*c*(c-)>>)%rhl);
  68. if (d>=) add(f[pre][a+][b-][c+][d-],1LL*res*(b*d*(d-)>>)%rhl);
  69. }
  70. }
  71. }
  72. }
  73. cout<<f[n&][][][][]; return ;
  74. }

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. 【c++】iostreeam中的类为何不可以直接定义一个无参对象呢

    缘起 #include <iostream> #include <fstream> #include <sstream> using namespace std; ...

  2. Xshell关闭导致jar服务终止,使Jar在CentOS后台运行

    环境:Xsehll6,CentOS7 在项目文件夹新建一个runjar.sh 在sh中写入(举例说明) nohup java -Dfile.encoding=UTF- -jar fin-mgmt-.j ...

  3. 【转】WCF 服务第一次调用慢的问题

    写了一个WCF Serivces供外部程序通过.NET Businesss Connector调用AX的代码,第一次调用的时候总是很慢,有时候甚至超过1分钟,访问地址改成http://localhos ...

  4. python 初级/中级/高级/核心

    "一等对象": 满足条件:1.在运行时创建 2.能赋值给变量或数据结构中的元素 3.能作为参数传递给函数 4.能作为函数的返回结果 [ 整数.字符串.字典."所有函数&q ...

  5. Golang教程:数组和切片

    数组 数组是类型相同的元素的集合.例如,整数 5, 8, 9, 79, 76 的集合就构成了一个数组.Go不允许在数组中混合使用不同类型的元素(比如整数和字符串). 声明 var variable_n ...

  6. 测试域名ping延迟脚本

    #!/bin/bash if [ $# -lt 1 ]thenecho "Usage:avg file1"exit 1fiecho "================== ...

  7. Chetsheet: 2017 01.01 ~ 01.31

    Web TypeScript: the missing introduction Async HTTP API and service bus Optimizing the Performance o ...

  8. Python入门-内置函数二

    看到标题你也能猜到今天要说大概内容是什么了,没错,昨天没有说完的部分再给大家说说(有一些重合的部分),内置函数的内容比较多,并且工作中经常用到的却不太多,很多都是不太常用的,所以我就着重说一些比较常用 ...

  9. 【转】OkHttp使用进阶 译自OkHttp Github官方教程

    作者:GavinCT 出处:http://www.cnblogs.com/ct2011/ 英文版原版地址 Recipes · square/okhttp Wiki 同步get 下载一个文件,打印他的响 ...

  10. 【转载】从创业者角度看《印度合伙人 Padman》后的一点感受

    ***************************** 这部电影看简介是真实事件改编的,当时除了电影本身的精彩和主角宠妻狂魔之外,印象最深的就是感觉到主角的创业者心态是一步步在生活中被培养的.特别 ...