cstring

Prime Path[POJ3126] [SPFA/BFS]

安稳与你 提交于 2021-02-20 03:00:59
描述 孤单的zydsg又一次孤单的度过了520,不过下一次不会再这样了。zydsg要做些改变,他想去和素数小姐姐约会。 所有的路口都被标号为了一个4位素数,zydsg现在的位置和素数小姐姐的家也是这样,如果两个路口间只差1个数字,则有一条路连通两个路口。(例如1033和1073间有一条路连接) 现在,你知道了zydsg的位置和素数小姐姐的家,问最少zydsg要走多少条路才能见到素数小姐姐。例如:如果zydsg在1033,素数小姐姐的家在8179,最少要走6条街,走法为: 1033 1733 3733 3739 3779 8779 8179 Input 输入数据有多组,首先是一个数字n,代表之后有n组数据。 其次,在每一组输入中,都包含两个数字a和b,代表zydsg的位置和素数小姐姐家的位置。 其中,a和b都是四位数,而且不含前导0。 Output 每组输入输出一行,表示zydsg最少需要走多少条路。若不存在合法的路径,则输出单词“Impossible”。 Sample Input 3 1033 8179 1373 8017 1033 1033 Sample Output 6 7 0 分析 首先我们要筛素数,接下来 方法一: 两个“相邻的”素数连边,每次从开头向终点跑SPFA 方法二: 按个十百千位向四周扩散,BFS 代码(SPFA) 1 #include< set > 2

【开坑】codeforces水题泛做

不打扰是莪最后的温柔 提交于 2021-02-19 02:37:41
关于一些水题,思维题,套路dp菜得不行,于是点了个dp-tag,开了这个坑 目前困于水平只限制了1k4到1k8分数段的题,按过题人数降序, 1k6+就很虐我了估计放开上限到2k+就受不了了QAQ 由于cf的tag机制,混了一些 奇怪的东西 不太像dp的题进来,能练手的也尽量写了 总之,为了队友,为了湘潭邀请赛和女生赛,赶紧提高到能独立完成gym3x的程度吧(还是太菜了QAQ 455A - 删a[k]会删除所有a[k]-1和a[k]+1,获得a[k] dp[i]为 数字1-i 能获得的最大价值 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #define LL long long 6 #define INF 0x3f3f3f3f 7 #define debug(x) cout << #x << " = " << x << endl; 8 using namespace std; 9 10 const int mx = 1e5; 11 LL dp[mx+ 7 ]; 12 int vis[mx+ 10 ]; 13 14 int main(){ 15 int n, a, m = 0 ; 16 scanf( " %d " , & n); 17 for ( int

单源最短路径---Bellman-Ford算法

心不动则不痛 提交于 2021-02-18 18:29:34
传送门: Dijkstra Bellman-Ford SPFA Floyd 1.Dijkstra算法的局限性 像上图,如果用dijkstra算法的话就会出错,因为如果从1开始,第一步dist[2] = 7, dist[3] = 5;在其中找出最小的边是dist[3] = 5;然后更新dist[2] = 0,最终得到dist[2] = 0,dist[3] = 5,而实际上dist[3] = 2;所以如果图中含有负权值,dijkstra失效 2.Bellman-Ford算法思想 适用前提:没有负环(或称为负权值回路),因为有负环的话距离为负无穷。 构造一个最短路径长度数组序列dist 1 [u] dist 2 [u]...dist n-1 [u],其中: dist 1 [u]为从源点v0出发到终点u的只经过一条边的最短路径长度,并有dist 1 [u] = Edge[v0][u] dist 2 [u]为从源点v0出发最多经过不构成负权值回路的两条边到终点u的最短路径长度 dist 3 [u]为从源点v0出发最多经过不构成负权值回路的三条边到终点u的最短路径长度 ................ dist n-1 [u]为从源点v0出发最多经过不构成负权值回路的n-1条边到终点u的最短路径长度 算法最终目的是计算出dist n-1 [u],即为源点到顶点u的最短路径长度 初始:dist

最长回文子序列和最长回文子串

断了今生、忘了曾经 提交于 2021-02-18 17:33:07
对于回文子序列,因为是不连续的肯定是不能直接枚举,那么利用动态规划。 我们可以知道对于任意字符串,如果头尾字符相同,那么字符串的最长子序列等于去掉首尾的字符串的最长子序列加上首尾;如果首尾字符不同,则最长子序列等于去掉头的字符串的最长子序列和去掉尾的字符串的最长子序列的较大者。那么转移方程:dp[i][j]=dp[i+1][j-1] + 2 if(s[i] == s[j]) dp[i][j]=max(dp[i+1][j],dp[i][j-1]) if (s[i] != s[j]) #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn= 1005 ; char s[maxn]; int dp[maxn][maxn]; int main() { scanf( " %s " ,s); int len= strlen(s); for ( int i=len- 1 ;i>= 0 ;i-- ) { dp[i][i] = 1 ; for ( int j=i+ 1 ;j<=len;j++ ) { if (s[i]== s[j]) dp[i][j] =dp[i+ 1 ][j- 1 ]+ 2 ;

【CH5105】Cookies

☆樱花仙子☆ 提交于 2021-02-18 15:48:46
也是一道线型动态规划的好题…… 读入每个人的贪婪度之后,对其按照从大到小的顺序排序,定义状态f[i][j]为前i个人(排序后)分j个饼干的答案,那么答案为f[n][m],考虑状态转移方程。 1、若给第i个人的饼干数大于1 ,那么我们将这i个人的饼干数都减1(总共减n),他们的怨气值是不会改变的,因而这种情况下,f[i][j]=f[i][j-i]. 2、若给第i个人的饼干数等于1,那么我们枚举一个k(0≤k<i),表示从k之后一直到i所有的人的饼干数都是1,那么f[i][j]=f[k][j-(i-k)]+k*∑g[c[p]] (k<p<=i). 我们先预处理出g数组的前缀和,即可实现O(n)的转移。 综上,我们在两种决策中取最优即可。另外,本题要求输出方案,我们只需在状态转移时记录每个状态的前驱即可。 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 int n,m,f[ 40 ][ 5010 ],a[ 40 ][ 5010 ],b[ 40 ][ 5010 ]; 7 int s[ 50 ],ans[ 50 ]; 8 int g[ 50 ],c[ 50 ]; 9 bool cmp( int x, int y) {

AtCoder Beginner Contest 104

∥☆過路亽.° 提交于 2021-02-18 15:30:15
A - Rated for Me Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100 100 points Problem Statement A programming competition site AtCode regularly holds programming contests. The next contest on AtCode is called ABC, which is rated for contestants with ratings less than 1200 1200 . The contest after the ABC is called ARC, which is rated for contestants with ratings less than 2800 2800 . The contest after the ARC is called AGC, which is rated for all contestants. Takahashi's rating on AtCode is R R . What is the next contest rated for him? Constraints 0 ≤ R ≤ 4208 0≤R≤4208 R R is an integer.

【bzoj2121】字符串游戏 区间dp

元气小坏坏 提交于 2021-02-18 12:29:37
题目描述 给你一个字符串L和一个字符串集合S,如果S的某个子串在S集合中,那么可以将其删去,剩余的部分拼到一起成为新的L串。问:最后剩下的串长度的最小值。 输入 输入的第一行包含一个字符串,表示L。 第二行包含一个数字n,表示集合S中元素个数。 以下n行,每行一个字符串,表示S中的一个元素。 输入字符串都只包含小写字母。 输出 输出一个整数,表示L的最短长度。 样例输入 aaabccd 3 ac abc aaa 样例输出 2 题解 我们考虑:每次删除连续的一段,对应到原串上即:删除 $[l,r]$ 中所有未被删除的字符。其中 $l,r$ 都未被删除。 这样就相当于选择若干区间来删除。 注意到选择的任意两个区间要么包含要么不相交(相离),对于相邻的相离的也可以看作是包含(右区间左端点看作是左区间左端点,即一个空位置),因此只有包含关系。 那么如下图: 先选择 $[b,c]$ 的串 $S$ ,再选择 $[a,d]$ 的串 $T$ ,可以看作是处理出 $[a,b)$ 能够匹配到 $T$ 的中间位置,$[b,c]$ 能够匹配到 $S$ 的结束位置(即删除掉),进而推知 $[a,c]$ 能够匹配到 $T$ 的中间位置,再向右匹配得知 $[a,d]$ 能够匹配到 $T$ 的结束位置。 考虑区间dp。设 $f[l][r]$ 表示 $[l,r]$ 是否可以全部删掉,再设 $g[l][r][i][j

百练 04 简单的整数划分问题

不想你离开。 提交于 2021-02-18 08:27:58
原文地址:http://www.cnblogs.com/wanghetao/archive/2013/11/25/3442192.html 描述 整数划分是一个经典的问题。请写一个程序,完成以下要求. 输入 每组输入是两个整数n和k。(1 <= n <= 50, 1 <= k <= n) 输出 对于输入的 n,k; 第一行: 将n划分成若干正整数之和的划分数。 第二行: 将n划分成k个正整数之和的划分数。 第三行: 将n划分成最大数不超过k的划分数。 第四行: 将n划分成若干个 奇正整数之和的划分数。 第五行: 将n划分成若干不同整数之和的划分数。 第六行: 打印一个空行 样例输入 5 2 样例输出 7 2 3 3 3 提示 样例输出提示: 1.将5划分成若干正整数之和的划分为: 5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1 2.将5划分成2个正整数之和的划分为: 3+2, 4+1 3.将5划分成最大数不超过2的划分为: 1+1+1+1+1, 1+1+1+2, 1+2+2 4.将5划分成若干 奇正整数之和的划分为: 5, 1+1+3, 1+1+1+1+1 5.将5划分成若干不同整数之和的划分为: 5, 1+4, 2+3 本题使用动态规划( Dynamic Programming)方法解决 一 求将 n划分为若干正整数之和的划分数 1.

[SCOI2010]序列操作

ぃ、小莉子 提交于 2021-02-17 01:00:30
嘟嘟嘟 这一看都知道,肯定是线段树,只不过这个稍微有些复杂…… 首先对于操作0和1都是很好办的,比较简单的区间修改。然后查询区间多少个1,就是区间和,也好办。 至于查询连续个1,做过 酒店 的都知道怎么办,维护一个imax[now](imax是interval's max,不是电影……):区间连续的1是多少个,lmax[now]:从now区间的左端点开始有多少个连续的1,rmax[now]从右端点开始有多少连续个1,这样区间合并的时候就是imax[now] = max(imax[now << 1], imax[now << 1 | 1], rmax[now << 1] + lmax[now << 1 | 1]). 查询酒店那道题没讲。对于要找的区间[L, R],如果各有一部分在当前区间的左右儿子中,那么分三种情况:1.在左儿子中,那么递归下去。1.在右儿子中,同样递归下去。3.最优解可能一部分在左儿子中,一部分在右儿子中,然而不能直接返回 t[now << 1].rmax +t[now << 1 |1].lmax,因为还有当前要找的区间的限制,因此是min(t[now << 1].rmax1, mid - L + 1) + min(t[now << 1| 1].lmax1, R - mid - 1 + 1)。然后这三种情况取max返回。 最后有解决的是区间反转问题,也是开一个标记

codeforces 920 EFG 题解合集 ( Educational Codeforces Round 37 )

允我心安 提交于 2021-02-16 19:59:37
E. Connected Components? time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given an undirected graph consisting of n vertices and edges. Instead of giving you the edges that exist in the graph, we give you m unordered pairs ( x ,  y ) such that there is no edge between x and y , and if some pair of vertices is not listed in the input, then there is an edge between these vertices. You have to find the number of connected components in the graph and the size of each component. A connected component is a set of vertices X such