ACM算法竞赛
文章平均质量分 72
QZQmmmm
微软程序员;业余摄影师;业余吉他手;业余游戏开发者;最大爱好是学习。
展开
-
RMQ题集+模板 hdu 2888+3486+3183 范围最小值 范围最大值
RMQ即范围最小值问题(或最大值)先给上Sparse-Table算法 模板void RMQ_make(){ int i,j; for(j = 1; (1<<j)<=n; ++j) { for(i = 0; i + (1<<j) - 1 < n; ++i) d[i][j] = max(d[i][j-1],d[i+(1<<(j-原创 2015-12-21 20:58:41 · 501 阅读 · 0 评论 -
2015广东工业大学新生赛 总结+部分题解
1.心态很重要。不能以OJ垃圾来推脱比赛。大家在同一个垃圾平台,比赛仍然是公平的。但行好事莫问前程。2.多在纸上写多推导。B题: A 和 B 的最小公倍数 为 C*K已知 A C 求B的个数。(A能整除C)起初以为K是当作变量来做,但是很明显,如果K当作变量那么显然B的个数是无数个。因为任意C*K,B都可以等于C*K.所以,显然K要当作常量,那么K是多少其实是无所谓原创 2015-12-06 10:20:34 · 2875 阅读 · 7 评论 -
hdu 5481 离散化
题目链接有一条数轴,还有一个区间的集合,集合大小为nn。现在等概率的从集合中选出集合的一个子集,求取出的子集的区间并集的期望长度。空集的区间并长度被认为是00。对于某一个长度为L的区间(这里所指的区间 不一定 是题目中所给的n个区间,可能是这n个区间中某一个的一个子区间),若只被覆盖1次,则其对结果的贡献就是 2^(n-1)*L。 2^(n-1) 即 包含这个区间 的 子原创 2015-12-05 11:33:18 · 569 阅读 · 0 评论 -
hdu 5501 贪心+DP
题目链接官方题解:这道题考察的是贪心思想和动态规划。首先我们考虑,假如我们已经确定了要做哪些题目,按什么顺序做这些题目最好。假设已经确定了要做其中的mm道题,某一个方案中做题的顺序是依次做x_{1},x_{2}\rightarrow{x}_{m}x1,x2→xm,那么对于这个方案中任意的相邻两项{x}_{i}xi,{x}_{i+1}xi+1原创 2015-12-03 18:46:54 · 462 阅读 · 0 评论 -
hdu 5570 期望 概率详解
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5570num[j] 表示 颜色为 j 的球的个数,题目要求 sum(num[j]^2) 0 b[i][j] 表示 i 球颜色为 j 的概率。不同球的颜色是互不影响的,所以直接相加就是 个数 ,所以num[j] = sum(b[i][j]) = b[1][j] + b[2][j] ....原创 2015-12-01 10:31:13 · 611 阅读 · 0 评论 -
hdu 5568 高精度(重要) DP
这个题似乎有问题,题中明明要求每个数组不同,想了很久,不知道怎么判重复,最后却看别人都是不判重 直接过的dp[i][j] 表示第i个数作为第j个数 的情况dp[i][f] = sum(dp[j][f-1]) num[i] > num[j]另外,如果大数使用十进制计算 要么 wrong answe 要么 爆内存 ,所以尽量开大 ,这里用的10^8#incl原创 2015-11-30 21:56:52 · 611 阅读 · 0 评论 -
九余数定理及证明 hdu 1163
九余数定理:一个数对九取余后的结果称为九余数。一个数的各位数字之和想加后得到的证明借鉴了网络上的证明,加以修改:首先证明前有两个基本需要知道的规律 1.和的模 等于 模的和再取模 如:(15+7)%3 = (15%3+7%3)%3 逆运算亦可2.积的模 等于 模的积再取模 如:(15*7)%3 = (15%3 * 7%3) %3 逆运算亦可原创 2015-11-30 16:16:21 · 2632 阅读 · 0 评论 -
hdu 1151 最小覆盖路径算法证明
又是二分图。若还不知道匈牙利算法,看我前面的文章先把每个点拆成两个,一个表示出,一个表示入,根据数据输入,对应的出点和对应入点之间构造了一条边。这样就有了一个二分图。有向图的最小路径覆盖 = 总的点数(为拆分前的) - 最大匹配数。证明如下:先假设所有点我们都派出一个伞兵。然后每增加一条匹配,就代表我们从一个点出走向一个点。并且根据最大匹配的定义,我们可以直接看作是将这两个点合并到原创 2015-11-29 10:09:09 · 554 阅读 · 0 评论 -
hdu 1130 卡特兰数列
卡特兰数列公式证明:问题大意是用S表示入栈,X表示出栈,那么合法的序列有多少个(S的个数为n)显然有c(2n, n)个含S,X各n个的序列,剩下的是计算不允许的序列数(它包含正确个数的S和X,但是违背其它条件)。在任何不允许的序列中,定出使得X的个数超过S的个数的第一个X的位置。然后在导致并包括这个X的部分序列中,以S代替所有的X并以X代表所有的S。结果是一个有(n+1)个S和(n-1原创 2015-11-28 17:25:41 · 987 阅读 · 0 评论 -
hdu 1142 记忆化搜索 dijkstra
遇到了不少问题下面是AC的代码,这几个问题有人也遇到的或者知道为什么的留言告诉下#include #include #include #include #include #include #define inf 99999999using namespace std;int n,m,map[1505][1505],dp[1505],dis[1505];bool vis[1原创 2015-11-28 16:35:28 · 421 阅读 · 0 评论 -
hdu 5592 树状数组+二分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5592官方题解设f_ifi是第ii个前缀的逆序对数,p_ipi是第ii个位置上的数,则f_i-f_{i-1}fi−fi−1是ii前面比p_ipi大的数的个数.我们考虑倒着做,当我们处理完ii后面的数,第ii个数就是剩下的数中第f_i-f_{i-1}+1fi−f原创 2015-12-06 20:04:48 · 472 阅读 · 0 评论 -
hdu 2196 树形DP
题解是原作者的题解,代码是我的代码本文出自 http://blog.csdn.net/shuangde800题意:给出一棵树,求离每个节点最远的点的距离思路:把无根树转化成有根树分析,对于上面那棵树,要求距结点2的最长距离,那么,就需要知道以2为顶点的子树(蓝色圈起的部分,我们叫它Tree(2)),距顶点2的最远距离L1转载 2015-12-07 20:47:58 · 479 阅读 · 0 评论 -
hdu 2234+1560 IDA*
IDA* 基本框架 hdu 1560hdu 2234 稍复杂的IDA*代码思路清晰,故不多加注释了。#include//hdu 1560#include#include#include#define MS(x,y) memset(x,y,sizeof(x))#define pi acos(-1.0)using namespace std;void fre(){freope原创 2015-12-19 15:47:41 · 837 阅读 · 0 评论 -
hdu 1423+hdu 4512 最长公共递增子序列
hdu1423 是 最长公共递增子序列的一个基本题 hdu 4512 是一个变式基本算法就是 结合最长公共子序列和最长递增子序列 的算法。附: 最长递增子序列:http://blog.csdn.net/techmonster/article/details/49515587 最长公共子序列+变式:http://blog.csdn.net/techmonster/article/det原创 2015-12-19 13:12:58 · 516 阅读 · 0 评论 -
hdu 1633 数位DP 好题
数位DP, 仍然使用前面提到过的模板 (之前的文章《数位DP题目汇总》:http://blog.csdn.net/techmonster/article/details/50284375)但是在细节上还是有比较多差别。#include#include#include#include#define MS(x,y) memset(x,y,sizeof(x))#define pi原创 2015-12-14 18:27:46 · 877 阅读 · 0 评论 -
hdu 数位DP汇总 + hdu 4507 题解
基础教学 + 初探hdu2089题解:http://blog.csdn.net/techmonster/article/details/50273967进阶 【重要模板】(数位dp几乎都是这个模板):http://blog.csdn.net/techmonster/article/details/50275783数位DP 优秀题目 hdu 4507 (注意,仍是上面的模板)原创 2015-12-13 16:55:13 · 1914 阅读 · 0 评论 -
hdu 3652 数位DP 进阶
dp[i][j][k] i表示数字位数(可以包含前导0,即00054也算5位数),3的余数,k表示状态(状态2为含有“13”,状态1为不含13末尾为1,否则状态为0) dp表示满足上述i、j、k的数字的个数。结合记忆化搜索(不用记忆化搜索其实也可以)。#include#include#include#include#define MS(x,y) memset(x,y,sizeo原创 2015-12-12 16:31:01 · 926 阅读 · 0 评论 -
hdu 2089 数位DP初探
数位DP 优秀的 教学 :http://wenku.baidu.com/link?url=o3ER_gVCyB0qcKthM-Y8vPtAGZ_u5bzOu_gUCUhPcXC6YfaSDgtBSXNEEvvGvSzyuDE9TULcPNsDrRd9IUtQVHeKUVrnPUjyfWjCly_J7Xq#include#include#include#include#defin原创 2015-12-12 12:18:23 · 2159 阅读 · 0 评论 -
hdu 4501 三重背包 易错点
一个小细节上弄错,调试了很久错误的dp for(i = 0; i < n; ++i) { for(j = v1; j >= 0; --j) { for(t = v2; t >= 0; --t) { for(l =原创 2015-12-11 15:41:17 · 426 阅读 · 0 评论 -
hdu 2298 二分+三分
对于这种 先递增后递减的情况,采用三分找到最大值点,再二分求解三分模板见代码#include#include#include#include#define MS(x,y) memset(x,y,sizeof(x))#define pi acos(-1.0)using namespace std;void fre(){freopen("t.txt","r",stdin);}typ原创 2015-12-10 21:43:08 · 492 阅读 · 0 评论 -
hdu 5464 DP 同余
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5464对于初学者,难的不是能不能想到DP,而是能不能想到 倍数问题 用 取模来解决(个人观点)对输入的 a[i] 都a[i] %= p.然后动态规划 dp[i][j] 表示前i个数中选择,总和%p 为 j 的个数。 dp[i][j] = dp[i-1][j] + dp[i-1][原创 2015-12-08 14:28:36 · 467 阅读 · 0 评论 -
hdu 1558 并查集+计算几何
易错用 warning标记#include #include #include #include #include #include using namespace std;struct node{ double x1,y1,x2,y2;}p[1005];int set[1005],num[1005];bool xiangjiao(int a,int b){ dou原创 2015-11-27 17:10:08 · 439 阅读 · 0 评论 -
hdu 1392 凸包问题
经典算法,百度上都能找到。就说一个特殊情况,只有两个点的时候,要进行特判,直接输出两点距离,否则会输出两倍。当然我认为就是应该输出两倍的,可是题目这样也没办法。#include#include#include#include#include#include#includeusing namespace std;int main(){// freopen("t.txt",原创 2015-11-26 20:37:42 · 545 阅读 · 0 评论 -
HDU 2064 二分图 匈牙利算法 零基本教学
在从来没有接触过图论的基础上学习了匈牙利算法和二分图 网上的资料大多需要知道一点图论的基本知识,为了和我一样的人能够看懂,就写一下零基础的。 先要看明白匈牙利算法,下面这篇文章,小白也能看懂。 http://blog.csdn.net/dark_scope/article/details/8880547 看完之后再看这个代码,整个代码就是按照上原创 2015-11-08 15:33:15 · 827 阅读 · 0 评论 -
hdu 1027 字典序
HDU 1027:http://acm.hdu.edu.cn/showproblem.php?pid=1027有简便的方法是使用 next_permutation函数, 函数用途是返回下一个字典序。 需要头文件除此之外,有必要知道如何手动的去得到下一个字典序。一列数字,第一个为num[0] 一次标号。1.从序列尾往前索引,找到第一个 num[i] ,满足num[i] 2.原创 2015-11-02 19:04:35 · 584 阅读 · 0 评论 -
HUD 1026 纯C代码广搜
网上找的大多是用C++,不会C++也不知道头文件的话,有些解题报告看不懂。#include int m,n,t = 0,ft[105][105],dp[105][105],q[101*101*20][2];char a[105][105];int dir[4][2]= {{0,-1},{0,1},{1,0},{-1,0}};void bfs(){ int x,y,xx,yy,p原创 2015-11-02 16:36:06 · 665 阅读 · 0 评论 -
hudu 1050 sort oj上的易错点 贪心算法
很容易的一道题,用的贪心算法。开始sort中的comp函数返回int,在本地运行时无论怎么测试都是对的,就是过不了OJ。int comp(ss a,ss b){ return a.s < b.s;}原来OJ上只能让comp返回bool才能过#include#include#include#include#include using namespace std;t原创 2015-11-01 13:30:31 · 808 阅读 · 0 评论 -
hdu 1031 qsort导致的WA
其实是一道很简单的排序题,但是一直错。最后终于找到了原因。 qsort中 comp 的错误使用导致,运行程序是输入数据总能得到正确答案,但是就是过不了OJ。int comp1(const void *a,const void *b){ ele *c = (ele *)a; ele *d = (ele *)b; if(c->mark == d->mark) return原创 2015-10-31 15:17:09 · 544 阅读 · 0 评论 -
HDU 1025 最长递增子序列 DP+二分法
HDU 1025题目看起来很长,实际上就是求 最长递增子序列O(n^2)的算法就不说了,这题O(n^2)也过不了。另外此题的输出格式值得注意,想当然的话很容易PE。O(nlogn)算法:之前的想法一直是dp[i]中的i表示第i个数时的状态。从来没想过表示子序列长度为i时的状态。另dp[i] 表示子序列长度为i时,子序列最后一个数的值。并且这个值在当前状态而言,对原创 2015-10-30 19:18:50 · 844 阅读 · 0 评论 -
hdu 1024 dp 解题报告
http://acm.hdu.edu.cn/showproblem.php?pid=1024自己也是没想出怎么做,看了解题报告。做完之后对DP能够有更深的理解。求n个数分为m段的最大和。首先比较难想到的是递推公式。假设j个数分为i段,求最大和,第j个数为a[ j ],当前状态为dp[ i ] [ j]。并且我们假定第j个数被分在最后一段中。那么,可以分为两种情况: 1原创 2015-10-30 12:04:23 · 558 阅读 · 0 评论 -
hdu 1102 最小生成树 prim
最小生成树的经典算法prim演示:图例说明不可选可选已选(Vnew)此为原始的加权连通图。每条边一侧的数字代表其权值。---顶点D被任意选为起始点。顶点A、B、E和F通过单条边与D相连。A是距离D最近的顶点,因此将A及对应边AD以高亮表示。原创 2015-11-19 18:58:05 · 445 阅读 · 0 评论 -
hdu 1053 哈夫曼树 优先队列
此题关于哈夫曼编码。哈夫曼树(霍夫曼树)又称为最优树.基本术语:1、路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。2、结点的权及带权路径长度若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权原创 2015-11-17 16:26:27 · 1376 阅读 · 0 评论 -
HDU 1505
首先,此题在输入地图时, R 与 F 之间并不一定是一个空格因此 采用下面的代码输入,会导致wa,尽管你怎么测试都是对的。 scanf("%d%d",&n,&m); getchar(); for(i = 1; i <= n; i++) { for(j = 1; j <= m; j++) { scanf("%c%*c",&a); if(a == 'F原创 2015-11-10 16:51:52 · 461 阅读 · 0 评论 -
hdu 1098 数学归纳法
此题主要工作在纸上完成,使用数学归纳法。假设任意X 都使 f(X)能被65 整除。那么,X = 1 时成立 即 18 + k*a 能被65整除。X = X + 1 亦成立 ,带入由二项式定理展开得 f(X) = 5*(c(13,0)x^13 + c(13,1)x^12....... c(13,13)x^0 ) + 13*(c(5,0)x^5.....) + kax + ka原创 2015-11-13 21:23:26 · 588 阅读 · 0 评论 -
hdu 1114 完全背包 背包问题通俗讲解
经典问题,在网上看到过很好的讲解http://www.cnblogs.com/daoluanxiaozi/archive/2012/05/06/2486105.html #include#include#include#include#include#include#includeusing namespace std;int dp[10001];int main()原创 2015-11-25 17:40:30 · 736 阅读 · 1 评论 -
hdu 1074 状态压缩DP 贪心 错的原因
第一次状态压缩DP,刚开始使用贪心策略,后来找到反例。输入:53a 1 1b 2 1c 1 1你的输出:2acb正确答案:2abc贪心能够算出正确的分数,但是不一定能得到正确的字典序。 因为贪心的时候根本没有考虑字典序。但是如果遇到类似题目只要求最小扣分,那么一定要用贪心,因为这题只有15门课,如果课多枚举状态dp的话肯定不行,而贪心就快得多。因此原创 2015-11-24 20:54:11 · 958 阅读 · 1 评论 -
二分图 最小覆盖数 = 最大匹配数、最大独立集 = 总数-最小覆盖集 证明 hdu 1068
二分图有两个定理:最小覆盖数=最大匹配数、最大独立集=总数-最小覆盖集 。这里来给出证明(如果还不懂匈牙利算法,请先看之前写的一篇)匈牙利算法链接几个基本定义:最小覆盖:即在所有顶点中选择最少的顶点来覆盖所有的边。最大匹配:二分图左右两个点集中,选择有边相连的两个匹配成一对(每个点只能匹配一次),所能达到的最大匹配数。最大独立集:集合中的任何两个点都不直接相连。最小覆盖数=原创 2015-11-24 13:19:58 · 4937 阅读 · 0 评论 -
hdu 1078 记忆化搜索
第一次记忆化搜索,实际上就是DP 就搜索这个题目要注意的是,他说每次可以走K步,在这K步中是不能转弯的#include #include #include #include #include using namespace std;int dp[105][105],map[105][105];int dir[4][2] = {0,1,0,-1,1,0,-1,0};int n原创 2015-11-23 16:49:53 · 547 阅读 · 0 评论 -
hdu 1080 带权值的 最长公共子序列 动态规划
要做这个题目,首先要会最长公共子序列。推荐hdu 1159. 顺带提供一篇别人写的解题报告 http://blog.csdn.net/a_eagle/article/details/7213236然后再看这题,思路基本相同。我们将'--' 设为0 'A'设为1 'C'设为2 'G'设为3 'T'设为4.根据输入构造序列 a和b。则根据题中表格可以得到一个二维数组 :原创 2015-11-22 12:42:11 · 788 阅读 · 0 评论 -
hdu1247+hdu1075 字典树基础
#include //hdu1075#include#includeusing namespace std;struct tree{ int flag,num;//flag用于标记是否为单词结尾 tree *next[26];//指向26个字母};tree *root;char s[1000000][20],b[4000];void creat(char str[],int原创 2015-11-22 11:49:08 · 562 阅读 · 0 评论