博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记忆化搜索
阅读量:4877 次
发布时间:2019-06-11

本文共 1801 字,大约阅读时间需要 6 分钟。

推荐的一篇记忆化搜索文章

https://interestinglsy.blog.luogu.org/memdfs-and-dp

总结

记忆化搜索跟偏向于DP,使用数组来存储状态,当搜到搜过的位置时直接返回数组中记录的信息

十分高效的搜索方法

code

int DFS(int x){    if(dp[x]) return dp[x];  //记忆化搜索的核心,之前搜过直接返回,避免重复搜索    int ans=0; //开一个变量记录子树的答案    if(judge()) ans++;//符合条件更新ans    for(E in Edges)    {        ans+=DFS(E);//把子树答案上传     }     dp[x]=ans; return ans;//记忆化搜索核心,记录信息,再返回搜到的答案 }

例题   P3183 食物链

题目描述

如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数。物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a3 b3......am-1 bm-1am bm其中ai bi表示能量从物种ai流向物种bi,注意单独的一种孤立生物不算一条食物链

输入输出格式

输入格式:

第一行两个整数n和m,接下来m行每行两个整数ai bi描述m条能量流动关系。(数据保证输入数据符号生物学特点,且不会有重复的能量流动关系出现)1<=N<=100000 0<=m<=200000题目保证答案不会爆 int

输出格式:

一个整数即食物网中的食物链条数

solution:

对于每个入度为0的点进行记忆化搜索,注意特判是否没有出度(即是否为孤立的生物)

当搜到一个点没有出度时就是食物链的末端

#include
#include
#define ll long long#define maxn 100050#define re register#define maxm 200050using namespace std;ll dp[maxn],ans;struct Edge{ int v,nxt;}e[maxm<<2];int x,y;int cnt,n,m,head[maxn],in[maxn],out[maxn];inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return f*x;}inline void add(int u,int v){ e[++cnt].v=v; e[cnt].nxt=head[u]; head[u]=cnt;}ll dfs(int x){ if(dp[x]) return dp[x]; ll tmp=0; if(!out[x]) ++tmp; for(int i=head[x];i;i=e[i].nxt) { int v=e[i].v; tmp+=dfs(v); } dp[x]=tmp; return tmp;}int main(){ n=read(); m=read(); for(re int i=1;i<=m;++i) { x=read(); y=read(); in[y]++; out[x]++; add(x,y); } for(re int i=1;i<=n;++i) { if(!in[i]&&out[i]) ans+=dfs(i);//别忘了特判 } printf("%lld",ans); return 0;}

 

转载于:https://www.cnblogs.com/Liuz8848/p/10424261.html

你可能感兴趣的文章
KMP算法的Next数组详解
查看>>
Brackets (区间DP)
查看>>
Tarjan算法
查看>>
Strategic Game(树形DP)
查看>>
迷宫城堡 (求强连通)
查看>>
Oulipo (KMP 统计出现次数,裸题)
查看>>
图的割点算法 与 图的割边算法
查看>>
KMP算法 最小循环节 最大重复次数
查看>>
Proving Equivalences (强连通,缩点)
查看>>
并查集(模板)
查看>>
Cell Phone Networ (树形dp-最小支配集)
查看>>
Count the string (KMP 中 next数组 的使用)
查看>>
Period (KMP算法 最小循环节 最大重复次数)
查看>>
聊聊Iconfont
查看>>
sgu 103. Traffic Lights
查看>>
poj 3621 Sightseeing Cows
查看>>
hdu 3666 THE MATRIX PROBLEM
查看>>
TopCoder SRM 176 Deranged
查看>>
java 内存模型
查看>>
Javascript中数组与字典(即map)的使用
查看>>