1 条题解
-
2
本题是图上的动态规划,是一道比较模版的题目。
思路:首先按题目读入,顺便统计入度。然后将入度为 0 的点放入队列,进行拓扑排序。再对每条边进行动态规划,最后求最大值就行了。
#include <bits/stdc++.h> using namespace std; const int N = 100010; int n,m; int a[N],d[N]; int f[N][15]; queue<int> q; vector<int> g[N]; int main(){ cin>>n>>m; for(int i = 1;i <= n;i++) cin>>a[i];//读入 for(int i = 1,u,v;i <= m;i++){ cin>>u>>v; g[u].push_back(v);//建边 d[v]++;//统计入度 } for(int i = 1;i <= n;i++){//拓扑排序初始化 if(!d[i]){ q.push(i); f[i][a[i]] = true; } } while(!q.empty()){ int u = q.front(); q.pop(); for(auto i : g[u]){//dp for(int j = 1;j <= 10;j++) f[i][j] = max(f[i][j],f[u][j]); d[i]--; if(!d[i]){ for(int k = a[i];k >= 1;k--) f[i][a[i]] = max(f[i][a[i]],f[i][k] + 1); q.push(i); } } } int ans = 1; for(int i = 1;i <= n;i++){ for(int j = 1;j <= 10;j++) ans = max(ans,f[i][j]);//求最大值 } cout<<ans<<endl; return 0; }
- 1
信息
- ID
- 655
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 11
- 已通过
- 8
- 上传者