[bzoj4562][Haoi2016]食物链_记忆化搜索_动态规划

news/2024/7/7 17:33:48

食物链 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]]

然后用记忆化爆搜即可。

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#define MOD 1000000007 
#define N 100010 
#define M 200010 
using namespace std;
typedef long long ll;
ll dp[N];
int num[N];
char s[N][100];
map<string,int>mp;
// ll stack[M<<1];
// ll val(int a)
// {
// 	ll ans1=1,ans2=1,ans3=1;
// 	int k=strlen(s[a]+1);
// 	for(int i=1;i<=k/3;i++) ans1=ans1*(s[i]-'0')%mod;
// 	for(int i=k/3+1;i<=k/3*2;i++) ans2=ans2*(s[i]-'0')%mod;
// 	for(int i=k/3*2+1;i<=k;i++) ans3=ans3*(s[i]-'0')%mod;
// }
struct Node
{int val,id,now;
}qqq[N];
// int map[1000000];
int head[N],to[M],nxt[M],tot;
inline void add(int x,int y)
{to[++tot]=y;nxt[tot]=head[x];head[x]=tot;
}
int dfs(int pos,int fa)
{if(dp[pos]) return dp[pos];for(int i=head[pos];i;i=nxt[i]){if(to[i]==fa) continue;dp[pos]+=dfs(to[i],pos);dp[pos]%=MOD;}if(dp[pos]==0) dp[pos]=1;return dp[pos]%MOD;
}
inline bool cmp1(Node o,Node oo)
{return o.val<oo.val;
}
inline bool cmp2(Node o,Node oo)
{return o.id<oo.id;
}
ll sum[N];
int main()
{// freopen("chain.in","r",stdin);// freopen("chain.out","w",stdout);ll ans=0,/* top=0, */cnt=0;int m;scanf("%*d%d",&m);// puts("Fuck");for(int i=1;i<=m;i++){string s1,s2;cin >> s1 >> s2 ;if(!mp[s1]) mp[s1]=++cnt;if(!mp[s2]) mp[s2]=++cnt;add(mp[s1],mp[s2]);num[mp[s1]]++;sum[mp[s2]]++;// scanf("%s%s",s[1]+1,s[2]+1);// int x=val(1),y=val(2);// printf("Bitch %d %d\n",x,y);// top+=2;// stack[++top]=x,stack[++top]=y;// qqq[top-1].val=x,qqq[top].val=y;// qqq[top-1].id=top-1,qqq[top].id=top;// add(x,y);}// sort(qqq+1,qqq+top+1,cmp1);// qqq[0].val=qqq[1].val-1;// for(int i=1;i<=top;i++)// {// 	if(qqq[i-1].val!=qqq[i].val) cnt++;// 	qqq[i].now=cnt;// }// for(int i=1;i<=top;i++)// {// 	printf("Woc %d   %d\n",qqq[i].val,qqq[i].now);// }// sort(qqq+1,qqq+top+1,cmp2);// for(int i=1;i<=top;i++)// {// 	printf("Fuck %d\n",qqq[i].now);// }// for(int i=2;i<=top;i+=2)// {// 	add(qqq[i-1].now,qqq[i].now);// 	sum[qqq[i].now]++;// 	maxnow=max(maxnow,sum[qqq[i].now]);// 	maxnow=max(maxno)// }for(int i=1;i<=cnt;i++){if(!sum[i]&&!num[i]) continue;if(!sum[i]) ans+=dfs(i,0);// printf("CaoNiMa %d\n",i);}// for(int i=1;i<=cnt;i++)// {// 	printf("EYWR %lld\n",dp[i]);// }printf("%lld\n",ans);return 0;
}

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

转载于:https://www.cnblogs.com/ShuraK/p/9301714.html


http://lihuaxi.xjx100.cn/news/255235.html

相关文章

数组与纠结的排序篇

数组之纠结的排序 1.数组是什么&#xff1f; 数组&#xff1a;所谓数组&#xff0c;就是相同数据类型的元素按一定顺序排列的集合&#xff0c;就是把有限个类型相同的变量用一个名字命名&#xff0c;然后用编号区分他们的变量的集合&#xff0c;这个名字称为数组名&#xff0c;…

接口性能优化技巧,有点硬...

欢迎关注方志朋的博客&#xff0c;回复”666“获面试宝典文章来源&#xff1a;http://b.nxw.so/1jSSgg目录背景哪些问题会引起接口性能问题问题解决总结背景我负责的系统在去年初就完成了功能上的建设&#xff0c;然后开始进入到推广阶段。随着推广的逐步深入&#xff0c;收到了…

基于OHCI的USB主机 —— 结束语

从去年11月份开始连载的《基于OHCI的USB主机》系列总算告一段落了&#xff0c;到UFI命令层为止&#xff0c;所有USB主机的底层处理就结束了&#xff0c;再上面就是磁盘读写、文件系统、文件读写和应用系统了。这些上层应用基本上是与USB主机没有什么关系的&#xff0c;我的这个…

GPT-3 再更新,新增编辑和插入文本功能,简直不要太好用!

编译 | 禾木木出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;GPT-3 是 OpenAL 提出的基于上下文的超大规模自然处理深度学习模型。这意味着如果你给 GPT-3 某些上下文内容时&#xff0c;它会试图去填充其余内容。例如给出句子的前部分&#xff0c;它会推测出下半部分…

LeetCode实战:合并两个有序数组

题目英文 Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: The number of elements initialized in nums1 and nums2 are m and n respectively.You may assume that nums1 has enough space (size that is greater o…

人工智能本科专业高校名单大全(440所)

Datawhale干货 编辑&#xff1a;机器之心、Datawhale文章有点长&#xff0c;目录预览&#xff1a;清华大学刘知远教授答疑各大开设人工智能的院校在计算机专业和人工智能日益火爆的当下&#xff0c;很多人对这两个专业又是好奇又是憧憬。对此&#xff0c;清华大学刘知远教授近日…

ADSL注册表优化技巧 XP

【导读】针对使用windows XP的用户&#xff0c;ADSL注册表简易优化策略介绍如下&#xff1a;在做这些修改之前请先做好注册表的备份&#xff0c;以便不适合你的情况的时候或修改错误时恢复。(注意&#xff1a;本方法只适用于PPPoE方式的ADSL用户) ADSL优化势在必行&#xff0c;…

webpack笔记(6)调试模式

在配置devtool时&#xff0c;webpack给我们提供了四种选项。 source-map:在一个单独文件中产生一个完整且功能完全的文件。这个文件具有最好的source map,但是它会减慢打包速度&#xff1b;cheap-module-source-map:在一个单独的文件中产生一个不带列映射的map&#xff0c;不带…