[bzoj4562][Haoi2016]食物链_记忆化搜索_动态规划
食物链 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)的...
[bzoj4562][Haoi2016]食物链_记忆化搜索_动态规划的更多相关文章
- P3183 [HAOI2016]食物链[拓扑/记忆化搜索]
题目来源:洛谷 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数.物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a ...
- CF894E Ralph and Mushrooms_强连通分量_记忆化搜索_缩点
Code: #include<cstdio> #include<stack> #include<cstring> using namespace std; cons ...
- 【BZOJ1048】分割矩阵(记忆化搜索,动态规划)
[BZOJ1048]分割矩阵(记忆化搜索,动态规划) 题面 BZOJ 洛谷 题解 一个很简单的\(dp\),写成记忆化搜索的形式的挺不错的. #include<iostream> #inc ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- poj 1088 滑雪_记忆化搜索
题意:略 直接用记忆化搜索就行了 #include<cstdio> #include<iostream> using namespace std; int n,m; int m ...
- 洛谷 p2618 数字工程 记忆化搜索_ 线性筛
我们在线筛的同时处理出每个数的所有质因子,记忆化搜索的时候直接枚举质因子即可. 时间复杂度为 O(nlogn)O(nlogn)O(nlogn) Code: #include<cstdio> ...
- BZOJ4513 SDOI2016 储能表 记忆化搜索(动态规划)
题意: 题面中文,不予翻译:SDOI2016储能表 分析: 据说有大爷用一些奇怪的方法切掉了这道题%%%%% 这里用的是大众方法——动态规划. 其实这是一道类似于二进制数位dp的动态规划题,(但是实际 ...
- 阿牛的EOF牛肉串-记忆化搜索或动态规划
C - 阿牛的EOF牛肉串 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submi ...
- UVa 10599【lis dp,记忆化搜索】
UVa 10599 题意: 给出r*c的网格,其中有些格子里面有垃圾,机器人从左上角移动到右下角,只能向右或向下移动.问机器人能清扫最多多少个含有垃圾的格子,有多少中方案,输出其中一种方案的格子编号. ...
随机推荐
- Android内存解析(一)—从Linux系统内存逐步认识Android应用内存
总述 Android应用程序被限制了内存使用上限,一般为16M或24M(具体看系统设置),当应用的使用内存超过这个上限时,就会被系统认为内存泄漏,被kill掉.所以在android开发时,管理好内存的 ...
- C++ 中的友元(friend)
首先友元不是一个好的设计,它破坏了封装.并且自身有很多局限:比如友元关系不能被继承:友元关系是单向的,不具有交换性:友元关系不具有传递性. 类内声明的 friend 变量(或者函数)在访问该类的成员时 ...
- KMP字符匹配算法
上个假期就学了KMP,但是基本不用,所以忘干净了...这个的核心思想就是next数组,next数组学名叫最长相同前缀后缀.还不错的算法,KMP 匹配的过程中比原来的暴力匹配多了一个跳来跳去的next. ...
- 洛谷 P2668 & P2540 [ noip 2015 ] 斗地主 —— 搜索+贪心
题目:https://www.luogu.org/problemnew/show/P2668 https://www.luogu.org/problemnew/show/P2540 首先,如果没有 ...
- 关于每次取PC的值为PC+4的问题
关于ARM的书上常说由于流水线特性,在指令执行期间读取程序计数器时,读出的值需要为当前指令+4 一开始总是不理解,今天被一位大神一语道破其中精髓.... 程序计数器(PC)总是指向“正在取指”的指令 ...
- bzoj1708[Usaco2007 Oct]Money奶牛的硬币(背包方案数dp)
1708: [Usaco2007 Oct]Money奶牛的硬币 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 763 Solved: 511[Submi ...
- 原生JS---8
原生js学习笔记8——Ajax基础 什么是Ajax 不刷新页面的情况下从服务器获取.提交数据的一种数据交互方式. Ajax使用步骤 1.创建Ajax对象 var httpRequest = new ...
- LocalDateTime查找最近的五分钟点
/** * 最近的五分钟 * @param dateTime * @return */ public static LocalDateTime getNear5(LocalDateTime dateT ...
- 【转载】JavaScript中同名标识符优先级-Snandy
一,局部变量先使用后声明,不影响外部同名变量 var x = 1; // --> 外部变量x function fn(){ alert(x); // --> undefined 局部变量x ...
- Java多线程-synchronized关键字
进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程 Ja ...