食物链 bzoj-4562 Haoi-2016

题目大意:给你n个点,m条边的DAG,求所有的满足条件的链,使得每条链的起点是一个入度为0的点,中点是一条出度为0的点。

注释:$1\le n\le 10^5$,$1\le m\le 2*10^5$。

想法:考试T2,全场切

动态规划

状态:dp[i]表示从这个点到出度为0的点的方案数。

转移:dp[i]+=dp[to[i]]

然后用记忆化爆搜即可。

最后,附上丑陋的代码... ...

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <map>
  6. #define MOD 1000000007
  7. #define N 100010
  8. #define M 200010
  9. using namespace std;
  10. typedef long long ll;
  11. ll dp[N];
  12. int num[N];
  13. char s[N][100];
  14. map<string,int>mp;
  15. // ll stack[M<<1];
  16. // ll val(int a)
  17. // {
  18. // ll ans1=1,ans2=1,ans3=1;
  19. // int k=strlen(s[a]+1);
  20. // for(int i=1;i<=k/3;i++) ans1=ans1*(s[i]-'0')%mod;
  21. // for(int i=k/3+1;i<=k/3*2;i++) ans2=ans2*(s[i]-'0')%mod;
  22. // for(int i=k/3*2+1;i<=k;i++) ans3=ans3*(s[i]-'0')%mod;
  23. // }
  24. struct Node
  25. {
  26. int val,id,now;
  27. }qqq[N];
  28. // int map[1000000];
  29. int head[N],to[M],nxt[M],tot;
  30. inline void add(int x,int y)
  31. {
  32. to[++tot]=y;
  33. nxt[tot]=head[x];
  34. head[x]=tot;
  35. }
  36. int dfs(int pos,int fa)
  37. {
  38. if(dp[pos]) return dp[pos];
  39. for(int i=head[pos];i;i=nxt[i])
  40. {
  41. if(to[i]==fa) continue;
  42. dp[pos]+=dfs(to[i],pos);
  43. dp[pos]%=MOD;
  44. }
  45. if(dp[pos]==0) dp[pos]=1;
  46. return dp[pos]%MOD;
  47. }
  48. inline bool cmp1(Node o,Node oo)
  49. {
  50. return o.val<oo.val;
  51. }
  52. inline bool cmp2(Node o,Node oo)
  53. {
  54. return o.id<oo.id;
  55. }
  56. ll sum[N];
  57. int main()
  58. {
  59. // freopen("chain.in","r",stdin);
  60. // freopen("chain.out","w",stdout);
  61. ll ans=0,/* top=0, */cnt=0;
  62. int m;
  63. scanf("%*d%d",&m);
  64. // puts("Fuck");
  65. for(int i=1;i<=m;i++)
  66. {
  67. string s1,s2;
  68. cin >> s1 >> s2 ;
  69. if(!mp[s1]) mp[s1]=++cnt;
  70. if(!mp[s2]) mp[s2]=++cnt;
  71. add(mp[s1],mp[s2]);
  72. num[mp[s1]]++;
  73. sum[mp[s2]]++;
  74. // scanf("%s%s",s[1]+1,s[2]+1);
  75. // int x=val(1),y=val(2);
  76. // printf("Bitch %d %d\n",x,y);
  77. // top+=2;
  78. // stack[++top]=x,stack[++top]=y;
  79. // qqq[top-1].val=x,qqq[top].val=y;
  80. // qqq[top-1].id=top-1,qqq[top].id=top;
  81. // add(x,y);
  82. }
  83. // sort(qqq+1,qqq+top+1,cmp1);
  84. // qqq[0].val=qqq[1].val-1;
  85. // for(int i=1;i<=top;i++)
  86. // {
  87. // if(qqq[i-1].val!=qqq[i].val) cnt++;
  88. // qqq[i].now=cnt;
  89. // }
  90. // for(int i=1;i<=top;i++)
  91. // {
  92. // printf("Woc %d %d\n",qqq[i].val,qqq[i].now);
  93. // }
  94. // sort(qqq+1,qqq+top+1,cmp2);
  95. // for(int i=1;i<=top;i++)
  96. // {
  97. // printf("Fuck %d\n",qqq[i].now);
  98. // }
  99. // for(int i=2;i<=top;i+=2)
  100. // {
  101. // add(qqq[i-1].now,qqq[i].now);
  102. // sum[qqq[i].now]++;
  103. // maxnow=max(maxnow,sum[qqq[i].now]);
  104. // maxnow=max(maxno)
  105. // }
  106. for(int i=1;i<=cnt;i++)
  107. {
  108. if(!sum[i]&&!num[i]) continue;
  109. if(!sum[i]) ans+=dfs(i,0);
  110. // printf("CaoNiMa %d\n",i);
  111. }
  112. // for(int i=1;i<=cnt;i++)
  113. // {
  114. // printf("EYWR %lld\n",dp[i]);
  115. // }
  116. printf("%lld\n",ans);
  117. return 0;
  118. }

小结:先想到dp是关键。学长写的全是什么toposort..都是O(n)的...

[bzoj4562][Haoi2016]食物链_记忆化搜索_动态规划的更多相关文章

  1. P3183 [HAOI2016]食物链[拓扑/记忆化搜索]

    题目来源:洛谷 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a ...

  2. CF894E Ralph and Mushrooms_强连通分量_记忆化搜索_缩点

    Code: #include<cstdio> #include<stack> #include<cstring> using namespace std; cons ...

  3. 【BZOJ1048】分割矩阵(记忆化搜索,动态规划)

    [BZOJ1048]分割矩阵(记忆化搜索,动态规划) 题面 BZOJ 洛谷 题解 一个很简单的\(dp\),写成记忆化搜索的形式的挺不错的. #include<iostream> #inc ...

  4. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

  5. poj 1088 滑雪_记忆化搜索

    题意:略 直接用记忆化搜索就行了 #include<cstdio> #include<iostream> using namespace std; int n,m; int m ...

  6. 洛谷 p2618 数字工程 记忆化搜索_ 线性筛

    我们在线筛的同时处理出每个数的所有质因子,记忆化搜索的时候直接枚举质因子即可. 时间复杂度为 O(nlogn)O(nlogn)O(nlogn) Code: #include<cstdio> ...

  7. BZOJ4513 SDOI2016 储能表 记忆化搜索(动态规划)

    题意: 题面中文,不予翻译:SDOI2016储能表 分析: 据说有大爷用一些奇怪的方法切掉了这道题%%%%% 这里用的是大众方法——动态规划. 其实这是一道类似于二进制数位dp的动态规划题,(但是实际 ...

  8. 阿牛的EOF牛肉串-记忆化搜索或动态规划

    C - 阿牛的EOF牛肉串 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submi ...

  9. UVa 10599【lis dp,记忆化搜索】

    UVa 10599 题意: 给出r*c的网格,其中有些格子里面有垃圾,机器人从左上角移动到右下角,只能向右或向下移动.问机器人能清扫最多多少个含有垃圾的格子,有多少中方案,输出其中一种方案的格子编号. ...

随机推荐

  1. Android5.0 Recovery源代码分析与定制(一)【转】

    本文转载自:http://blog.csdn.net/morixinguan/article/details/72858346 版权声明:本文为博主原创文章,如有需要,请注明转载地址:http://b ...

  2. UVA 10006(素数打表+快速幂)

    当今计算机科学的一个重要的领域就是密码学.有些人甚至认为密码学是计算机科学中唯一重要的领域,没有密码学生命都没有意义. 阿尔瓦罗就是这样的一个人,它正在设计一个为西班牙杂烩菜饭加密的步骤.他在加密算法 ...

  3. Docker EE/Docker CE简介与版本规划

    随着Docker的不断流行与发展,docker公司(或称为组织)也开启了商业化之路,Docker 从 17.03版本之后分为 CE(Community Edition) 和 EE(Enterprise ...

  4. python中使用pip安装报错:Fatal error in launcher... 解决方法

    python安装了2和3版本在 cmd 中用pip报的错误为:Fatal error in launcher:Unable to create process using 这是因为你安装了python ...

  5. Spark2.0.2+Zeppelin0.6.2 环境搭建 初探

    0.抱怨与其他(此部分与标题没有太多联系): 首先一点想说的是版本问题,为什么标题我会写清楚版本号呢!原因就是版本不对真的很会坑人. 就在写这篇博客的同一天,我还写了另一篇,是 Hadoop2.7.3 ...

  6. Beta冲刺-星期三

    这个作业属于哪个课程  <课程的链接>            这个作业要求在哪里 <作业要求的链接> 团队名称 Three cobblers 这个作业的目标 剩余任务预估,分配 ...

  7. 3B课程笔记分享_StudyJams_2017

    昨晚才发现 Study Jams China的官方论坛也支持MarkDown,所以直接发在了那上面.http://www.studyjamscn.com/thread-21807-1-1.html

  8. 浅谈ByteBuffer转换成byte[]时遇到的问题

    有些时候我们要把ByteBuffer转换成byte[]来使用.于是很多时候会用以下代码来转换: ByteBuffer buf; .....(一些往buffer写数据的操作) byte[] bs= ne ...

  9. H265

    H265 h265  一.名词 CTU: 编码树单元 CU: 编码单元 PU: 以CU为根,对CU进行划分,一个预测单元PU包含一个亮度预测块PB和两个色度预测块PB. TU: 以CU为根,变换单元T ...

  10. ionic + cordova开发APP遇到的一些坑

    ionic1时期接触了这套体系,做了一个APP之后就放置了,最近又要开发一个APP,但时间不足以让我重头了解typescripts,于是又把之前做过的东西翻了出来,一边做一边掉坑里,爬上来再掉坑里,所 ...