Codeforces 919D Substring ( 拓扑排序 && DAG上的DP )
题意 : 给出含有 N 个点 M 条边的图(可能不连通或者包含环),每个点都标有一个小写字母编号,然后问你有没有一条路径使得路径上重复字母个数最多的次数是多少次,例如图上有条路径的顶点标号顺序是 abcaca 那么答案就是 3 ,因为 a 出现了三次,如果答案无穷大则输出 -1
分析 :
不难联想到是一个动态规划类型的题目
定义 DP[i][j] 为到达顶点 i 时字母 j 最多出现了多少次
显然如果图中有环的话就输出 -1
这也就是说如果图中不存在合法拓扑排序就说明有环
如果存在拓扑排序,那么就是一个DAG
我们可以构造出拓扑序列,然后在这个图上进行上述DP过程
状态转移方程为 dp[ i 出度顶点 ][j] = max{ dp[ i 出度顶点][j], dp[i][j] + (i 出度顶点编号 == j ? 1 : 0) }
可以使用队列构造拓扑排序,在构造的过程中完成 DP
#include<bits/stdc++.h>
using namespace std;
;
struct EDGE{ int v, nxt; }Edge[maxn];
char ch[maxn];
int Deg[maxn];
];
int Head[maxn], cnt;
int N, M;
inline void init()
{
; i<=N; i++){
Head[i] = -, Deg[i] = ;
; j<; j++)
dp[i][j] = ;
}
cnt = ;
}
inline void AddEdge(int From, int To)
{
Edge[cnt].v = To;
Edge[cnt].nxt = Head[From];
Head[From] = cnt++;
}
#define Debug 0
int main(void)
{
#if Debug
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif // Debug
while(~scanf("%d %d", &N, &M)){
; i<=N; i++)
scanf(" %c", &ch[i]);
// for(int i=1; i<=N; i++)
// putchar(ch[i]);
init();
int From, To;
while(M--){
scanf("%d %d", &From, &To);
AddEdge(From, To);
Deg[To]++;
}
queue<int> que;
while(!que.empty()) que.pop();
; i<=N; i++)
if(!Deg[i]){
que.push(i);
dp[i][ch[i]-;
}
;
while(!que.empty()){
int v = que.front();
que.pop();
num++;
; i=Edge[i].nxt){
int Eiv = Edge[i].v;
; j<; j++)
dp[Eiv][j] = max(dp[Eiv][j], dp[v][j] + (ch[Eiv]-'a' == j));
Deg[Eiv]--;
if(!Deg[Eiv])
que.push(Eiv);
}
}
//printf("%d\n", num);
if(num != N){
puts("-1");
continue;
}else{
;
; i<=N; i++){
; j<; j++){
ans = max(ans, dp[i][j]);
}
}
printf("%d\n", ans);
}
}
;
}
Codeforces 919D Substring ( 拓扑排序 && DAG上的DP )的更多相关文章
- CodeForces - 919D Substring (拓扑排序+dp)
题意:将一个字符串上的n个字符视作点,给出m条有向边,求图中路径上最长出现的相同字母数. 分析:首先如果这张图中有环,则可以取无限大的字符数,在求拓扑排序的同时可以确定是否存在环. 之后在拓扑排序的结 ...
- Codeforces 919D Substring (拓扑排序+树形dp)
题目:Substring 题意:给你一个有向图, 一共有n个节点 , m条变, 一条路上的价值为这个路上出现过的某个字符最多出现次数, 现求这个最大价值, 如果价值可以无限大就输出-1. 题解:当这个 ...
- UVA - 10131Is Bigger Smarter?(DAG上的DP)
题目:UVA - 10131Is Bigger Smarter? (DAG) 题目大意:给出一群大象的体重和IQ.要求挑选最多的大象,组成一个序列.严格的体重递增,IQ递减的序列.输出最多的大象数目和 ...
- Codeforces 919D Substring 【拓扑排序】+【DP】
<题目链接> 题目大意:有一个具有n个节点,m条边的有向图,每个点对应一个小写字母,现在给出每个顶点对应的字母以及有向边的连接情况,求经过的某一条路上相同字母出现的最多次数.如果次数无限大 ...
- Codeforces 919D - Substring
919D - Substring 思路: 拓扑排序判环+DAG上dp+记忆化搜索 状态:dp[i][j]表示以i为起点的路径中j的最大出现次数 初始状态:dp[i][j]=1(i have no so ...
- CodeForces 721C Journey(拓扑排序+DP)
<题目链接> 题目大意:一个DAG图有n个点,m条边,走过每条边都会花费一定的时间,问你在不超过T时间的条件下,从1到n点最多能够经过几个节点. 解题分析:对这个有向图,我们进行拓扑排序, ...
- Codeforces 510C (拓扑排序)
原题:http://codeforces.com/problemset/problem/510/C C. Fox And Names time limit per test:2 seconds mem ...
- E - E CodeForces - 1100E(拓扑排序 + 二分)
E - E CodeForces - 1100E 一个n个节点的有向图,节点标号从1到n,存在m条单向边.每条单向边有一个权值,代表翻转其方向所需的代价.求使图变成无环图,其中翻转的最大边权值最小的方 ...
- CodeForces - 1100E 二分+拓扑排序
题意: 一个n个节点的有向图,节点标号从1到n,存在m条单向边.每条单向边有一个权值,代表翻转其方向所需的代价.求使图变成无环图,其中翻转的最大边权值最小的方案,以及该方案翻转的最大的边权. Inpu ...
随机推荐
- 【VS开发】【图像处理】RGB各种格式
RGB格式 RGB组合格式 名字 RGB组合格式 描述 此格式用来匹配PC图形帧缓存.每个像素占据8,16,24或32个位,他们都是组合像素格式,其意为在内存中所有像素数据都是相邻排列的.当使用这些格 ...
- ios系统App Store安装包下载链接获取
今天将自己开发的Android版本和ios版本的安装包通过生成二维码的方式展示在H5页面上,Android版的比较简单,但是ios的安装包用户必须从App Store(苹果应用市场)中下载安装,所以获 ...
- 字符串转Interger
public static void main(String[] args) { String t = "5"; Integer integer = Integer.valueOf ...
- spring boot-9.对springMVC的支持
1.thymeleaf spring boot 推荐的模板引擎是thymeleaf.spring boot 的自动配置已经默认配置好了themleaf,只要导入themleaf的Starter就可以了 ...
- springboot - 应用实践(N)使用springboot内置的@Scheduled
1.springboot开箱即用,内置调度任务的使用. 建一个简单的springboot工程,pom.xml: <?xml version="1.0" encoding=&q ...
- C#模态对话框和非模态对话框
模态对话框弹出窗口阻止调用窗口的所有消息响应.只有在弹出窗口结束后调用窗口才能继续.在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值. 非模态对话框可以在弹出窗口和调用 ...
- Python中字典合并的四种方法
字典是Python语言中唯一的映射类型.映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表.字典对象是可变的,它是一个容器类型,能存储任意个数的 ...
- MYSQL 的事物处理(四大特性)
什么是事物? MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库 ...
- Linux五大网络IO模型图解
对于一个应用程序即一个操作系统进程来说,它既有内核空间(与其他进程共享),也有用户空间(进程私有),它们都是处于虚拟地址空间中.用户进程是无法访问内核空间的,它只能访问用户空间,通过用户空间去内核空间 ...
- 使用了框架iframe的页面如何跳出框架
"window.location.href"."location.href"是本页面跳转. "parent.location.href" 是 ...