算法竞赛入门经典
文章平均质量分 55
SeasonJoe
这个作者很懒,什么都没留下…
展开
-
UVa11324 The Largest Clique(强连通分量+DP)
题意:看白书要点:求出强连通分量后缩成点,内部点数作为权,进行DAG的DP。#include#include#include#include#includeusing namespace std;const int maxn=1010;vector g[maxn],map[maxn];int dfn[maxn],lowlink[maxn],sccno[maxn],d原创 2016-09-15 19:44:24 · 331 阅读 · 0 评论 -
例题9-4 UVa116 Unidirectional TSP(DP:多段图的最短路)
题意:看白书要点:一共三种决策:直行,右上,右下。那么就递推,注意题目中可以从第一列的任意一行出发,而且是环形的,最后还得按字典序输出路径,路径输出就直接用数组记录,因为是倒序递推,所以正序直接可以得到路径。#include#include#include#includeusing namespace std;const int inf = 0x3f3f3f3f;原创 2016-05-15 11:59:51 · 470 阅读 · 0 评论 -
例题9-2 UVa437 The Tower of Babylon(DP:DAG中的最长路)
题意:看白书要点:将x,y,h分别作为高,这样n就转换为3*n种立方体,而且因为每种都有无穷个,所以正好自己叠在自己上的情况也考虑到了,这就转换为前面的嵌套矩形问题,进行一次记忆化搜索即可。#include#include#include#includeusing namespace std;struct node{ int x, y, h;}a[350*3原创 2016-05-15 10:19:51 · 450 阅读 · 0 评论 -
习题6-3 UVa536 Tree Recovery(树的遍历转换)
题意:给出先序和中序求后序要点:递归完成,只要注意一下边界就可以了,水题#include#include#includechar s1[30], s2[30];char tree[30];int count;void build(int l1, int r1,int l2,int r2){ if (l1 > r1) return; //空树 int p原创 2016-03-06 09:31:38 · 600 阅读 · 0 评论 -
例题9-10 UVa1626&&POJ1141 Brackets Sequence(DP)
题意:看白书要点:状态转移方程真难想,这基本上是个区间DP问题,但还得考虑首尾已经是正规的,这两种情况都要考虑,而且还互相干扰,最后还得打印解,基本就是重新检查一下哪个决策最好。还有个陷阱:输入串可能是空串,所以要用gets。15546092Seasonal1141Accepted4024K32MSC++1166B2016-0原创 2016-05-24 17:50:26 · 334 阅读 · 0 评论 -
例题10-2 UVa12169 Disgruntled Judge(拓展欧几里德)
题意:看白书要点:再一个办法就是枚举a,利用x1,x3求出b,判断所有x的关系能不能满足a,b。如何通过a,x1,x3求出b呢。x2 = (a * x1 + b) % 10001;x3 = (a * x2 + b) % 10001;联立2个式子x3 = (a * (a * x1 + b) % 10001 + b ) % 10001;x3 =原创 2016-04-27 16:45:24 · 423 阅读 · 0 评论 -
例题10-4 UVa10791 Minimum Sum LCM(最小公倍数的最小和)
题意:看白书要点:运用唯一分解定理,使每个ai^pi作为一个单独的整数时最优。例如72=8*9时最优。注意:如果本身是一个素数最后还要+1,而且如果本身分解后只有一种因子,最后也要+1,如1=1*1,答案是2。一开始我担心时间想用线性筛什么的,后来发现做不出,看了一下题解发现只要普通的遍除即可,现在做题因为担心时间有点畏手畏脚了啊,其实一般的题上去莽就可以了。#includ原创 2016-04-26 10:28:49 · 566 阅读 · 0 评论 -
例题10-1 UVa11582 Colossal Fibonacci Numbers!(同余与模算术)
题意:看白书要点:先斐波那契数列打个表,然后用同余与模算术,找个规律就行。注意数的最大值为2^64,用long long型还不够,必须要用unsigned long long型。#include#include#include#includeint fibo[1025][8000];int g[1025];int pow_mod(unsigned long l原创 2016-04-25 21:50:58 · 523 阅读 · 0 评论 -
贪心法经典问题总结
乘船问题:要点什么的看白书,解释的已经很详细了。从这道题我们可以证明贪心法不会丢失最优解,因此可以通过贪心得到最优解。题目:点击打开链接#include#include#include#includeusing namespace std;int main(){ int t,w,n,i,j; int a[305]; scanf("%d", &t); whi原创 2016-04-06 16:27:03 · 1031 阅读 · 0 评论 -
最大连续和
这个问题对我来说还挺难的,当初做DP时水过去了,但没彻底理解,这次打算好好分析一下,争取彻底搞懂。首先,像:1 -1 2 2 3 -3 4 -4 5 -5这样的数列,想要找连续最大和,可以有很多种方法,从最慢的枚举O(n^3)到最快的动态规划O(n),毫无疑问,我们要选择复杂度低的算法。所以我这里就只分析两种:分治法O(nlogn)和动态规划O(n)。分治法O(nlogn):原创 2016-04-03 16:24:51 · 358 阅读 · 0 评论 -
子集生成
一:增量构造法思路是一次选出一个元素放入集合中#includevoid print_subset(int n,int a[],int cur){ for (int i = 0; i < cur; i++) printf("%d ", a[i]); printf("\n"); int s = cur? a[cur - 1] + 1 : 0;//cur为0则s为0,否则s=a[原创 2016-03-09 19:05:18 · 376 阅读 · 0 评论 -
习题6-5 UVa1600 Patrol Robot(BFS)
题意:机器人走迷宫求最小步数,不同之处在于机器人最多能一次连续穿过k堵墙。要点:BFS模板题稍微有些变换,将vis数组增加到三维来记录穿墙数即可,因为有的时候就算坐标相同,但穿过墙数不同也是不同的。#include#include#include#includeusing namespace std;int map[50][50],vis[50][50][50];原创 2016-03-08 09:11:02 · 421 阅读 · 0 评论 -
例题6-17 UVa10562 Undraw the Trees(树)
题意:将一棵多叉树转换成括号表示法要点:用先序遍历直接在二维数组内递归,主要是字符的输入判断比较麻烦,还有如果同时用scanf和gets的话,要把scanf后的换行符除去#include#include#include#include#define maxn 250char buf[maxn][maxn];int n;void dfs(int r, int原创 2016-02-22 12:20:13 · 332 阅读 · 0 评论 -
枚举排列
根据字典序,依次输出全排列,整理一下,有两种方法:一种递归,一种利用C++中的STL一:生成可重集的排列#include#include#includeint p[20];int cmp(const void *a, const void *b){ return *(int *)a - *(int *)b;}void print_permutation(int n, i原创 2016-03-06 16:20:09 · 415 阅读 · 0 评论 -
例题6-16 UVa10129 Play on Words(欧拉回路)
题意:输入一些单词,看是否能将这些单词首尾分别对应相同的排成一个序列要点:欧拉道路,也即是从无向图的一个结点出发走出一条道路,每条边恰好经过一次,俗称一笔画,对于无向图来说:如果一个无向图是连通的(任意一个点出发,通过dfs遍历可得到所以顶点),且最多只有两个度数为奇数的顶点,则一定存在欧拉道路。如果有两个奇点,一定从一个奇点出发一个奇点结束;如果奇点不存在,则可以从任意点出发,一原创 2016-02-20 22:12:34 · 472 阅读 · 0 评论 -
例题9-12 UVa12186 Another Crisis(树型DP)
题意:看白书要点:白书上写的还是很清楚的,通过递归进行动态规划,vector还真是好用,暑假的时候学一下。#include#include#include#include#include#define maxn 100005using namespace std;int n, T;vector son[maxn];int dp(int x){ if原创 2016-05-29 10:37:21 · 399 阅读 · 0 评论 -
例题5-4 UVa156 Ananagrams(STL:map)
题意:看白书要点:树型DP求树的最大独立集需要用到map,本来想暑假学了C++再学STL的,后来觉得还是先稍微学一下,能简单使用再说。这题就是照着书上敲了一下。不得不说,C++真是比C好用太多了。#include#include#include#include#include#includeusing namespace std;map cnt;vector原创 2016-05-29 22:03:52 · 384 阅读 · 0 评论 -
例题9-7 UVa11400 Partitioning by Palindromes(DP+回文串)
题意:看白书要点:回文串处理,传递边界,从左边界枚举到中心,如果出现不相等的说明不是回文串,否则为回文串。DP:以d[i]存储第i个字符前划分成的回文串的个数的最小值,如果第i个字符和前面第j个字符之间的为回文串,那么d[i]=d[j-1]+1。因此状态转移方程就是d[i]=max(d[i],d[j-1]+1)。边界值d[0]=0,因为取最小值,一开始d数组赋值为一个比较大的数。原创 2016-05-18 16:19:53 · 465 阅读 · 0 评论 -
【Trie的模板】例题11 LA3942 Remember the Word(字典树+dp)
Trie也就是字典树,可以处理一些字符串的查找问题,写起来还是很简单的,下面记录一下模板:#include#include#include#includeusing namespace std;const int maxnode = 1000;const int sigma_size = 28;struct Trie{ int ch[maxnode][sigma_size]原创 2016-11-26 14:52:17 · 382 阅读 · 0 评论 -
RMQ问题
BMQ问题就是在一系列连续的数中,找出一个区间内最小的数,基本思路就是用d[i][j]表示从i开始,长度为2^j的一段元素中的最小值,直接先递推预处理,时间是O(nlogn),查找就O(1)基本模板:#include#include#includeusing namespace std;const int maxn = 10000;int d[maxn][maxn];void原创 2016-11-14 15:46:09 · 412 阅读 · 0 评论 -
例题29 UVa11825 Hackers' Crackdown(DP:子集)
题意:看白书二P67要点:这题还是有点难度的,思维上比较难想到,具体解析看白书吧。#include#include#includeusing namespace std;const int N = 1 << 20;int s[N],p[N],cover[N],f[N];int main(){ int n; int i,kase=1; while (~scanf原创 2016-10-13 19:14:17 · 294 阅读 · 0 评论 -
例题27 UVa10635 Prince and Princess(DP:LIS的nlogn算法)
题意:看白书要点:这题本来应该是LCS,但因为时间的要求,可以转化为LIS,而且还得用nlogn的算法,基本思路就是用b数组来存储当前b的值在a数组中对应的位置。LIS的nlogn算法的思路就是,每次用g来存储,并每次在其中进行二分查找,注意这里每次更新是不会改变LIS的性质的,最后g的结果不是所需的LIS,这里要注意一下。#include#include#include#i原创 2016-10-10 22:30:48 · 403 阅读 · 0 评论 -
例题5-2 UVa101 The Blocks Problem(STL:vector)
题意:看白书要点:学了一下vector中的resize()的用法,就是把resize(n),n及以上的都丢掉。这道题的归位的意思是放回对应的第i个堆。#include#include#include#includeusing namespace std;int n;vector pile[30];void FindPile(int a, int &p, int &h原创 2016-08-26 22:23:02 · 874 阅读 · 0 评论 -
例题5-7 UVa136 Ugly Numbers(STL:priority_queue)
题意:看白书要点:很简单的priority_queue应用题。之所以写个博客是为了总结一下priority_queue的写法。主要问题是VS中greater不是模板,但OJ中可以AC。需要特殊排序可以有以下两种写法:struct node{ int x, y;};struct cmp{ bool operator()(node a, node b) { ret原创 2016-08-28 16:57:00 · 619 阅读 · 0 评论 -
例题5-3 UVa10815 Andy's First Dictionary(STL:set&&sstream的应用)
题意:输入一长串字符串,将其中的单词按字典序输出。要点:STL中的set就像数学中的集合,每个元素最多只出现一次。ssteam可以很简单的将字符串转换为整数或反之。这题注意将所有不是字母的字符变成空格再进行一次出入流操作来除掉空格。#include#include#include#includeusing namespace std;set dict;int mai原创 2016-08-27 21:25:39 · 513 阅读 · 0 评论 -
UVa1625 Color Length(DP)
题意:看白书要点:白书上的题,还是有些难度的,具体分析看书吧,难点就是要求res[i][j]。#include#include#include#includeusing namespace std;#define maxn 5005#define inf 0x3f3f3f3fchar str1[maxn], str2[maxn];int len1, len2原创 2016-07-13 12:26:22 · 320 阅读 · 0 评论 -
例题9-6 UVa11400 Lighting System Design(DP)
题意:看白书要点:其他的白书上讲的比较清楚了,有点难以理解的是原创 2016-05-21 21:33:45 · 476 阅读 · 0 评论 -
例题9-11 UVa1331 Minimax Triangulation(DP:最优三角剖分)
题意:看白书要点:基本的三角剖分题,但要注意三个点:1.已知三角形三个顶点的坐标,可用行列式求面积,则S=(1/2)*(下面行列式) |x1 y1 1| |x2 y2 1| |x3 y3 1| S=(1/2)*(x1y2*1+x2y3*1+x3y1*1-x1y3*1-x2y1*1-x3y2*1) 2.这题没有说多边形一定是凸多边形,所以要考虑凹多边形的情况,原创 2016-05-20 22:44:03 · 959 阅读 · 0 评论 -
DP——最优矩阵链乘&&最优三角剖分
一个n*m的矩阵乘一个m*p的矩阵等于一个n*p的矩阵,运算量为mnp,现在有一组n个矩阵组成的序列,求运算量的最小值。这是DP中的最优矩阵链乘问题,我们可以这么理解:用一个d[i][j]来存储第i个矩阵链乘到第j个矩阵的最优解,那么现在进行DP化,也就是找它的子解。我们把这组序列从中间不同位置裂开,记这个位置为k,那么不难得到d[i][j]=d[i][k]+d[k+1][j]+p[i-1]*原创 2016-05-18 21:31:21 · 649 阅读 · 0 评论 -
ZOJ3785 What day is that day?(同余与模算术)
题意:今天星期六,求1^1+2^2……N^N天后是星期几要点;很明显是同余与模算术,用白书上的复杂度为O(logn)的算法。一开始我是想打表,但这题不能开数组,范围太大。后来我也想到找规律了,但我只打了30个的表,而规律从42开始,点背啊!下次注意了,打表尽量打多一点,而且注意一下排版让规律找起来比较方便。这题就是以42为一组循环,后面没问题了。#include#incl原创 2016-04-24 21:55:05 · 629 阅读 · 0 评论 -
例题9-9 UVa10003 Cutting Sticks(DP:矩阵链乘)
题意:看白书要点:明显是类似于矩阵连乘问题,用d[i][j]标记i到j中的最优费用,从中间一点k处截成两半,可以写出状态转移方程为d[i][j] = min(d[i][j], d[i][k] + d[k][j] + pos[j] - pos[i]),不难看出这实际是一个区间DP问题,通过j-i小区间不断递增进行DP,注意这里i和j不用写成0~len,因为d[i][j]只是起到一个存储状原创 2016-05-19 18:08:30 · 398 阅读 · 0 评论 -
例题7-1 UVa725 Division(枚举)
要点:用0~9编成两个五位数,要求两个数中每个数字只出现一次,第二个数中可以有前导0要点:用第二个数直接暴力枚举就可以#include#includeint num[10];int judge(int a,int b){ memset(num, 0, sizeof(num)); if (b > 98765) return 0; if (a < 10000)原创 2016-03-06 14:44:55 · 563 阅读 · 0 评论 -
例题6-15 UVa10305 Ordering Tasks(拓扑排序)
题意:看白书要点:利用dfs先将最深的赋值给数组中最后一个位置,相同深度的就随便排了,因为只输出一种,所以答案跟题目中给的可以不一样#include#include#includeint c[150],topo[150];bool g[150][150];int m, n,t;bool dfs(int u){ c[u] = -1; //原创 2016-02-18 10:12:05 · 652 阅读 · 0 评论 -
习题3-11 UVa1588 Kickdown
要点: 1.有三种可能:全在底板上,部分在底板上以及一点都不能在底板上,所以输入的字符串的长度有关系,同一组颠倒顺序结果不一样,因此求出两种取最小值#include<stdio.h>#include<string.h>int main(){ char a[110], b[110]; int i, j, m, n,t; while (scanf("%s%s", a, b原创 2015-11-20 19:49:55 · 552 阅读 · 0 评论 -
习题3-2 UVa 1586 Molar Mass
难点: C123H5OH12—- 下标出现多位数的情况要点: 1.另设一个getnum函数,当字符串出现数字转入,由此输出多位数的情况源代码:#include<stdio.h>#include<string.h>const int maxn=200;char s[maxn];double ans[maxn];int getnum(int pos, int len){ int te原创 2015-11-01 10:57:45 · 552 阅读 · 0 评论 -
习题3-3 UVa1225 Digit Counting
要点: 1.将10000个数所对应的情况制作成表,先全部算出所对应的值,然后输入时调用对应值源代码:#include<stdio.h>#include<string.h>int a[10005][10];int main(){ memset(a, 0, sizeof(a)); //将数组中所有数都赋值为0否则会随机输出 int i, j, m, n; for (i原创 2015-10-31 20:29:09 · 523 阅读 · 0 评论 -
习题3-4 UVa455 Periodic Strings
要点; 1.输入的字符串一点可以整除最小周期数 2.第一周期与第二周期所对应的字符相等源代码:#include<stdio.h>#include<string.h>int main(){ char s[105]; int len, i,j,t; scanf("%d", &t); while (t--) { scanf("%s", s)原创 2015-10-31 20:31:50 · 564 阅读 · 0 评论 -
例题4-5 UVa512 Spreadsheet Tracking
方法一: 要点: 1.利用三个函数,几乎涵盖了前面所学所有内容#include<stdio.h>#include<string.h>#define maxn 100#define big 10000int r, c, n, d[maxn][maxn], d2[maxn][maxn], ans[maxn][maxn], cols[maxn];//d2作为表格变化中原表格的存储,通过ans原创 2015-11-14 17:26:21 · 753 阅读 · 0 评论 -
???习题3-10 UVa1587 Box
1.低端暴力枚举法要点: 1.先判断6个长方形两两相等,然后将三个互异的长方形长和宽存入数组mark,再通过暴力枚举比较,任意两个长方形中必定有两个数相等#include<stdio.h>int a[6][2];int mark[6];int main(){ while (scanf("%d%d", &a[0][0], &a[0][1]) == 2) { //原创 2015-11-13 21:39:22 · 417 阅读 · 0 评论 -
习题3-6 UVa232 Crossword Answers
要点: 1.其他的很简单,关键是输出的时候要用for语句时要注意把原来的赋值为0跳过去,否则同一个单词会多次输出 2.注意格式,从第二个开始,input和output要隔一行,PE了好多次#include<stdio.h>#include<string.h>int main(){ int r, c; int p = 1; int num[12][12]; //作为原创 2015-11-14 11:06:32 · 491 阅读 · 0 评论