AcWing 周赛13 3813. 最大路径权值(拓扑排序 DAG上dp)

简介: AcWing 周赛13 3813. 最大路径权值(拓扑排序 DAG上dp)

原题链接

题意:

思路:

51nod的强化版

由于题目中存在环,对于环上的字母来说,每个字母都会出现无穷次,所以答案为i n f,输出− 1

如果不存在环,该图就是一个D A G,枚举每个字母,拓扑排序后用d p求解这个字母出现的最多次数就好。

判环的话:如果t o p s o r t 后仍有字母的入度> 0,说明有环。

代码:

const int maxn=3e5+100;
vector<int>g[maxn];
int n,m,dp[maxn][28],din[maxn];
char s[maxn];
int topsort(){
  queue<int>q;
  int siz=0;
  rep(i,1,n)
    if(din[i]==0){
      q.push(i);
      dp[i][s[i]-'a']=1;
      siz++;
    }
  while(!q.empty()){
    int t=q.front();q.pop();
    for(auto v:g[t]){
      rep(i,0,25){
        int tt=0;
        if(i==s[v]-'a') tt++;
        dp[v][i]=max(dp[v][i],dp[t][i]+tt);
      }
      if(--din[v]==0) q.push(v),siz++;
    }
  }
  rep(i,1,n)
      if(din[i]>0) return -1;
  int ans=0;
  rep(i,1,n)
    if(g[i].size()==0){
      rep(j,0,25) ans=max(ans,dp[i][j]);
    }
  return ans;
}
int main(){
  n=read,m=read;
  scanf("%s",s+1);
  rep(i,1,m){
    int u=read,v=read;
    din[v]++;
    g[u].push_back(v);
  }
  cout<<topsort();
  return 0;
}
目录
相关文章
|
6月前
daimayuan(代码源oj)最长路径(树形dp,无向树换根dp)
daimayuan(代码源oj)最长路径(树形dp,无向树换根dp)
126 0
|
5月前
|
搜索推荐 Java
单源最短路(只有一个起点)bfs,多源BFS,目录力扣675.为高尔夫比赛砍树,多源最短路问题:力扣542.01矩阵力扣1020.飞地的数量
单源最短路(只有一个起点)bfs,多源BFS,目录力扣675.为高尔夫比赛砍树,多源最短路问题:力扣542.01矩阵力扣1020.飞地的数量
|
6月前
|
人工智能 算法
一些算法的复习(最短路径、最小生成树、dp)
一些算法的复习(最短路径、最小生成树、dp)
|
存储 索引
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
78 0
初学算法之递归---爬楼梯
初学算法之递归---爬楼梯
|
人工智能 算法 BI
LeetCode 周赛 341 场,模拟 / 树上差分 / Tarjan 离线 LCA / DFS
上周末有单双周赛,双周赛我们讲过了,单周赛那天早上有事没参加,后面做了虚拟竞赛,然后整个人就不好了。前 3 题非常简单,但第 4 题有点东西啊,差点就放弃了。最后,被折磨了一个下午和一个大夜总算把第 4 题做出来了,除了新学的 Tarjon 离线算法,这道题还涉及到树上差分、前缀和、DFS、图论等基础知识,几度被折磨得想要放弃。这种感觉,似乎和当年在 LeetCode 上做前 10 题的时候差不多哈哈。
83 0
|
机器学习/深度学习 Java
【每日一题Day64】LC1799N 次操作后的最大分数和 | 状态压缩dp 状态压缩+dfs+记忆化搜索
每个数字有两种状态,删除或者未删除,因此可以使用状态压缩记录未删除的数字情况state,便于使用位运算进行状态的遍历及转移;使用状态压缩dp找到将所以数字删除的最大分数
103 0
【每日一题Day64】LC1799N 次操作后的最大分数和 | 状态压缩dp 状态压缩+dfs+记忆化搜索
每日三题-最大子数组和、不同路径、最小路径和
每日三题-最大子数组和、不同路径、最小路径和
72 0
每日三题-最大子数组和、不同路径、最小路径和
|
存储
【每日一题Day61】寻找图中是否存在路径 | BFS 并查集
初始时将source设为已访问,并且将其加入队列。之后每次将队列中的节点出队,并将其能够到达的未访问过的节点入队。如果访问到destination,则直接返回true;如果队列为空,仍未访问到destination,则返回false
115 0