洛谷 P4017 最大食物链计数(DAG上的dp)
传送门
解题思路
显然的用到类似树形dp的思想,在一个有向无环图上做dp。
状态转移方程就是dp[v]加起来。
AC代码
//其实不用long long也可以
1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstdio> 5 #include<cstring> 6 using namespace std; 7 const int mod=80112002; 8 const int maxn=500005; 9 int n,m,p[5005],cnt,ru[5005],chu[5005]; 10 long long dp[5005],ans; 11 struct node{ 12 int v,next; 13 }e[maxn]; 14 void insert(int u,int v){ 15 cnt++; 16 e[cnt].next=p[u]; 17 e[cnt].v=v; 18 p[u]=cnt; 19 } 20 void dfs(int u){ 21 if(dp[u]) return; 22 for(int i=p[u];i!=-1;i=e[i].next){ 23 int v=e[i].v; 24 dfs(v); 25 dp[u]=(dp[v]+dp[u])%mod; 26 } 27 } 28 int main() 29 { 30 memset(p,-1,sizeof(p)); 31 cin>>n>>m; 32 for(int i=1;i<=m;i++){ 33 int u,v; 34 scanf("%d%d",&u,&v); 35 insert(u,v); 36 ru[v]++; 37 chu[u]++; 38 } 39 for(int i=1;i<=n;i++){ 40 if(chu[i]==0){ 41 dp[i]=1; 42 } 43 } 44 for(int i=1;i<=n;i++){ 45 if(ru[i]==0){ 46 dfs(i); 47 ans=(ans+dp[i])%mod; 48 } 49 } 50 cout<<ans; 51 return 0; 52 }