cf919D 线性dp+拓扑排序
/*
给定一张有向图,图上每个结点都有一个字符,现在要求出一条路径,要使路径上某字符出现的次数最多
如果有环,输出-1即可
拓扑排序+dp
dp[i][26]表示排序到结点i时26个字符出现的次数
在每次访问到i时都进行dp
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 300005
struct Edge{int to,nxt;}edge[maxn<<];
int head[maxn],tot,n,m,ans;
char a[maxn];
void init(){
memset(head,-,sizeof head);
tot=;
}
void addedge(int u,int v){
edge[tot].to=v;edge[tot].nxt=head[u];head[u]=tot++;
} int in[maxn],dp[maxn][];
int main(){
init();
cin>>n>>m;
for(int i=;i<=n;i++)cin>>a[i];
for(int i=;i<=m;i++){
int u,v;
cin>>u>>v;
addedge(u,v);
in[v]++;
} queue<int>q;ans=;
int cnt=;
for(int i=;i<=n;i++)
if(in[i]==){
q.push(i);
dp[i][a[i]-'a']++;
}
while(!q.empty()){
int u=q.front();q.pop();
cnt++;
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
in[v]--;
for(int j=;j<;j++)
dp[v][j]=max(dp[v][j],dp[u][j]);
if(in[v]==){
q.push(v);
dp[v][a[v]-'a']++;
}
}
} if(cnt<n)puts("-1");
else {
for(int i=;i<=n;i++)
for(int j=;j<;j++)
ans=max(ans,dp[i][j]);
cout<<ans<<endl;
}
return ;
}
cf919D 线性dp+拓扑排序的更多相关文章
- The Preliminary Contest for ICPC Asia Nanjing 2019 - D Robots(概率dp+拓扑排序)
这题概率dp + 拓扑排序可以写 改天补解释 #include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; ve ...
- BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们也 ...
- Codeforces Round #460 (Div. 2)_D. Substring_[dp][拓扑排序]
题意:一个有向图,每个结点 被赋予一个小写字母,一条路径的value等与这条路径上出现次数最多的字母的数目,求该图的最大value 比赛时,用dfs超时,看官方题解用的dp和拓扑排序,a--z用0-2 ...
- ZJU 1346 Comparing Your Heroes 状态压缩DP 拓扑排序的计数
做多校的时候遇见一个求拓扑排序数量的题,就顺便来写了一下. 题意: 你有个朋友是KOF的狂热粉丝,他有一个对其中英雄的强弱比较,让你根据这些比较关系来给这些英雄排名.问一共有多少种排名方式. 思路: ...
- Educational DP Contest G - Longest Path (dp,拓扑排序)
题意:给你一张DAG,求图中的最长路径. 题解:用拓扑排序一个点一个点的拿掉,然后dp记录步数即可. 代码: int n,m; int a,b; vector<int> v[N]; int ...
- 洛谷P3953 逛公园(dp 拓扑排序)
题意 题目链接 Sol 去年考NOIP的时候我好像连最短路计数都不会啊qwq.. 首先不难想到一个思路,\(f[i][j]\)表示到第\(i\)个节点,与最短路之差长度为\(j\)的路径的方案数 首先 ...
- hdu 3696 10 福州 现场 G - Farm Game DP+拓扑排序 or spfa+超级源 难度:0
Description “Farm Game” is one of the most popular games in online community. In the community each ...
- [BZOJ4383][POI2015] Pustynia-[线段树+dp+拓扑排序]
Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r,k以及接下来k个正整数,表示a[l],a[l+1],. ...
- Codeforces 721C [dp][拓扑排序]
/* 题意:给你一个有向无环图.给一个限定t. 问从1点到n点,在不超过t的情况下,最多可以拜访几个点. 保证至少有一条路时限不超过t. 思路: 1.由无后向性我们可以知道(取决于该图是一个DAG), ...
随机推荐
- ssm框架所需jar包整理及各jar包的作用
以下是我目前新搭建的ssm项目的pom.xml 之后如果需要其他的话再加 <?xml version="1.0" encoding="UTF-8"?> ...
- windows10+ubuntu16.04双系统搭建
0 - 环境 操作系统: Windows 10 + Ubuntu 16.04 显卡: GTX 950M Cuda 9.0 cudnn v7.0 tensorflow-gpu==1.7.0 1 - ub ...
- Django学习手册 - 基于requests API验证(一)
验证需要知道requests提交数据的几种方式: GET 方式: # get 方式,传递数值可以直接通过url传递:(服务端接受 GET) requests.get(url='http://127.0 ...
- 查看oracle 用户执行的sql语句历史记录
select * from v$sqlarea t order by t.LAST_ACTIVE_TIME desc
- 关于链表所有操作,面试必考C++
#include <iostream> #include <stack> using namespace std; //链表的结构体 struct ListNode { int ...
- CF1108F MST Unification
题目地址:CF1108F MST Unification 最小生成树kruskal算法的应用 只需要在算法上改一点点 当扫描到权值为 \(val\) 的边时,我们将所有权值为 \(val\) 的边分为 ...
- C 和 C++ 一些基础
位运算: Part1: #include <iostream> using namespace std; int main(int argc, char *argv[]) { //unsi ...
- 【转】fnmatch模块的使用——主要作用是文件名称的匹配,并且匹配的模式使用的unix shell风格
[转]fnmatch模块的使用 fnmatch模块的使用 此模块的主要作用是文件名称的匹配,并且匹配的模式使用的unix shell风格.fnmatch比较简单就4个方法分别是:fnmatch,fnm ...
- Keepalived详解(三):Keepalived基础功能应用实例【转】
Keepalived基础功能应用实例: 1.Keepalived基础HA功能演示: 在默认情况下,Keepalived可以实现对系统死机.网络异常及Keepalived本身进行监控,也就是说当系统出现 ...
- Delta DVP 系列 PLC 各装置 Modbus 地址
此Modbus地址表以 1 为基础地址 Device Range Type DVP address (Hex) Modbus address (Dec) Effective ES/EX/SS SA/S ...