CF919D Substring (dag dp)】的更多相关文章

传送门 解题思路 感觉这种题都是套路,首先缩点判了环(没看见自环挂了一次..),然后设\(f[x][i]\)表示到了\(x\),\(i\)这个字母走过的最长距离,然后拓扑排序更新即可. 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<queue> using namespace std; const int MAXN = 300…
D. Substring time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output You are given a graph with n nodes and m directed edges. One lowercase letter is assigned to each node. We define a path's valu…
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 思路I:动态规划,遍历到i的时候要保证之前的元素都已经计算过状态,所以遍历顺序同插入排序,时间复杂度O(n2) class Solution { pu…
题面传送门: 传送门 思路: 看完题建模,容易得出是求单向图最长路径的问题 那么把这张图缩强联通分量,再在DAG上面DP即可 然而 这道题的建图实际上才是真正的考点 如果对于每一个点都直接连边到它所有的后继节点,那么可以被卡掉(1e5个点在同一行上) 考虑改变思路,运用网络流建图中的一个常用技巧:把横边和竖边映射成点,再从每个点向所在横坐标.纵坐标代表的点连边即可 这样会有2e6+1e5个点,但是tarjan算法效率O(n),完全无压力 自由(和谐)门的话,目前还没有比较好的方法解决 上网看了一…
传送门 解题思路 \(dag\)上\(dp\),首先要按照边权排序,然后图都不用建直接\(dp\)就行了.注意边权相等的要一起处理,具体来讲就是要开一个辅助数组\(g[i]\),来避免同层转移. 代码 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> using namespace std; const int M…
https://codeforces.com/problemset/problem/4/D 这个题目比较简单,就是一个DAG模型,这个可以看看紫书学习一下, 我这次是用dp来写的,用记忆化搜索也许更好写一点. 这个首先进行建图,用一个邻接表建图,G[i][j]表示第i个信封可以装进去第j个信封,这个再建图之前需要排序. 不然的话就不好写这个dp了,其实这里有一点点不太能理解. 建完图之后就是dp的转移, dp[i]表示从第i个信封开始可以装的最多的信封 状态转移就是 d[i]=dp[j]+1 这…
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 思路:如果不用动态规划,在两个for循环的情况下,还得依次比较i,j间的每个字符,O(n3).使用动态规划,O(n2) char* longestPa…
思路: 拓扑排序过程中dp.若图有环,返回-1. 实现: #include <bits/stdc++.h> using namespace std; ; vector<int> G[MAXN]; int in[MAXN], n, m; string value; ]; bool solve() { queue<int> q; ; i <= n; i++) { if (!in[i]) { q.push(i); dp[i][value[i - ] - ; } } wh…
手动博客搬家: 本文发表于20180716 10:53:12, 原地址https://blog.csdn.net/suncongbo/article/details/81061500 给定一个\(n\)个点\(m\)条边的有向图(不一定无环),每个点上有一个小写字母.要找一条路径,使得路径上出现次数最多的字母出现的次数最多.如果答案为无穷大输出-1. 题解:何时无穷大?有环的时候可以不停地走环,统计无限次答案,答案为无穷大.因此,对于-1的情况,只需要判一下环即可. 对于有限大的情况,令\(dp…
#include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <stack> #include <vector> using namespace std; const int MAX=111111; int N,E; int v[…