![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
POJ/HDOJ
文章平均质量分 64
zztant
这个作者很懒,什么都没留下…
展开
-
POJ3041 二分图匹配
题意:在一个NxN的正方形有一些外星人基地,问最少需要放多少个武器才能消灭所有的基地,每个武器只能对单独的某行或某列有效果,但是不能同时有效果。将行和列分别看成是两边的匹配点,转化成求最少的顶点数使所有的边都被覆盖。 需要了解一个定理:König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数。再转化成求二分图的最大匹配数,用匈牙利算法原创 2013-01-21 18:58:17 · 251 阅读 · 0 评论 -
HDOJ 1021 求fibonacci数的高4位
题目给定一个数n,非常大,n个这样的int型会超memory,要求fib[n],超过四位的数只要输出前4位首先考虑传统的O(n)算法求fibonacci数,显然先求出所有数然后保存下来会超过题目要求的memory,这种方法不适用,即我们无法将数保存下来然后输出,因此只能对每个要求的n,单独求出前四位,因此考虑直接使用公式,当然直接代公式是不可能,从只需要输出前4位这个条件入手,原创 2013-11-11 22:54:14 · 338 阅读 · 0 评论 -
HDOJ 1131 组合数学
问n个不同的节点可以组成多少种不同的树首先考虑对于相同的n个节点可以形成多少种树,设DP[N]为N个节点的情况,我们分别考虑左右子树的情况,假设左子树有i个节点,那么相对的右子树就存在N-i-1个节点,那么就有DP[N]=DP[i]*DP[N-i-1] i=0.1.2....N-1这是节点都相同的情况,那么,对于任意一个由k个节点组成的其中一种树,当这k个节点都不相同时,考虑k的全排原创 2013-11-15 17:08:17 · 300 阅读 · 0 评论 -
HDOJ 1712 动态规划
dp[i][j]表示前i门课在j天内所能获得的最大收益转移方程dp[i][j]=Max(dp[i-1][j-k]+A[i][k])注意优化空间时迭代的方向(多重背包和0/1背包的区别)#include#include#define Max(a,b) (a<b?b:a)using namespace std;int N,M;int A[101][101];原创 2013-12-06 22:45:55 · 297 阅读 · 0 评论 -
HDOJ 2545 0/1背包
对所有价格进行排序,将价值最大的留下来最后用必然可以构造对低价格,对前面n-1的菜模拟0/1背包求出#include#include#include#define Max(a,b) (a<b?b:a)using namespace std;int n;int p[1001];int m;bool dp[50001];bool cmp(int *a,int *b){原创 2013-12-07 21:21:16 · 280 阅读 · 0 评论 -
HDOJ 3496 二维背包
题意:有n个物品,每个物品有一个val[i]以及一个时间限制t[i],求再最大时间限制为L时,选择M个物品的最大sumval。这道题背包的第二维隐藏在只能从n个物品种选择M个这个限制,另一个就是总的时间限制L。我们可以看成每个物品占用一个可选容量和一个时间限制。可选容量恒为1,而时间限制维t[i]。状态转移方程dp[k][i][j]=Max(dp[k-1][i-1][j-t[k]]+v原创 2013-12-10 14:25:32 · 321 阅读 · 0 评论 -
HDOJ 1171 多重背包+优化
关键是思路,为的使两个分组中的值最接近,则只要求出可以取到的最接近最大值一半的那个数,因此将sum/2作为上线状态转移方程dp[i]=Max(dp[i-w[j]]+v[j],dp[i])由于这里没有v数组,因此退化成bool型的值#include#include#define Max(a,b) (a<b?b:a)using namespace std;bool dp[25原创 2013-12-03 18:58:20 · 291 阅读 · 0 评论 -
HDOJ 2899 求极点+二分
#include#include#define Min(a,b) (a<b?a:b)using namespace std;/* F(x) = 6*x^7 + 8*x^6 + 7*x^3 +5*x^2 -y*x * F(x)'= 42x^6 + 48*x^5 + 21*x^2 + 10*x = y */double get_sum(double x){ return原创 2013-12-13 19:54:58 · 294 阅读 · 0 评论 -
HDOJ 2199 二分
函数 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y 在X在[0,100]递增,直接二分求解#include#includeusing namespace std;/* * 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y * 32*x^3 + 21*x^2 + 4*x */double get_sum(原创 2013-12-13 19:03:51 · 306 阅读 · 0 评论 -
HDOJ 1597 不知道属于什么的水题
假设:S1 = 1S2 = 12S3 = 123S4 = 1234.........S9 = 123456789S10 = 1234567891S11 = 12345678912............S18 = 123456789123456789..................现在我们把所有的串连接起来S = 1121231234....原创 2013-12-15 22:24:10 · 433 阅读 · 0 评论 -
HDOJ CUP 二分求截锥体高
#include#include#define PI 3.1415926535898using namespace std;double Case,T,r,R,H,V,VT;int main(){ cin>>Case; while(Case--){ cin>>r>>R>>H>>V; double T,_r,_V; if(r==R){ printf("%.6lf\原创 2013-12-16 14:41:45 · 309 阅读 · 0 评论 -
HDOJ 2298 三分法求凸函数极值
二分法作为分治中最常见的方法,适用于单调函数,逼近求解某点的值。但当函数是凸性函数时,二分法就无法适用,这时三分法就可以“大显身手”~~ 如图,类似二分的定义Left和Right,mid = (Left + Right) / 2,midmid = (mid + Right) / 2; 如果mid靠近极值点,则Right = midmid;否则(即midmid靠近极值原创 2013-12-18 17:46:57 · 343 阅读 · 0 评论 -
HDOJ 2438 三分法+计算几何
车子过弯问题#include#include#define PI (acos(-1))using namespace std;double x,y,l,w;double gety(double angle){ return l*cos(angle)+w/sin(angle)-x/tan(angle);}int main(){ while(cin>>x>>y>>原创 2013-12-18 19:33:05 · 333 阅读 · 0 评论 -
HDOJ 2604 递推
给你一个长度为L的由m和f两种字母组成的字符串,定义存在fmf以及fff子串的都是不符合要求的串,问长度为L的符合要求的串有多少个那么当L=1,时,dp[1]=1,L=2时,dp[2]=4,L=3时,dp[3]=6考虑当L=n时的情况,将原问题拆分为两个子问题1.最后一个字符为m 。此时,只要前面长度为n-1的串符合要求,则当前长度为n串必然符合要求。2.最后一个字符为f。此时,存原创 2013-11-15 20:51:24 · 296 阅读 · 0 评论 -
HDOJ 3068 最长回文子串O(n)
求一个字符串中的最长回文长度的O(n)算法,这个算法有一个名字Manacher。具体原理与实现:假设存在一字符串 waabwswfd我们将在该字符串各字符之间以及边缘各插入一个特殊字符#构造新的字符串 #w#a#a#b#w#s#w#f#d ,这样做的好处是可以不用区分奇数串还是偶数串。并定义变量P[i]为新字符串中以第i个字符为中心的回文串其中心至边缘的距离,那么P[原创 2013-10-15 11:11:05 · 354 阅读 · 0 评论 -
POJ2942 点连通分量+奇圈判定 以及强连通分量,边连通,割边,割点
题意:有一群圆桌骑士要开会,会议需要圆桌骑士围着坐成一个圈,相互hate的骑士不能坐在边上,最少需要3个人才能开会,且一桌上面的人数必须是奇数告诉你相互hate的情况,问最少剔除多少人才能使会议进行? 解题思路:通过Tarjan算法找到所有点连通分支,每找到一组,判定是否为奇圈,若是,则将该连通分支中的点标记为可行点。由于一个点可能会出现在多个连通分支中,所以判断奇圈要再Tarja原创 2013-01-22 18:06:39 · 365 阅读 · 0 评论 -
POJ1328 贪心-线段最少的覆盖点
题意:告诉你一些鱼雷的位置,问至少需要多少雷达才能监测到所有的鱼雷,雷达只能放在x轴上 贪心思路:将鱼雷的位置映射到x轴上的一个区间,则题目就转化成求区间的最小覆盖点区间按起点的x轴排序后开始贪心 #include#include#include#define Min(a,b) a<b?a:btypedef struct{ double left; double原创 2013-01-21 18:39:23 · 257 阅读 · 0 评论 -
POJ2635 高精度+同余模定理
题意:给定一个大整数N,以及另一个数M,已知N是两个素数的乘积,如果其中较小一个数小于M,则输出这个数,否则输出GOOD 解题思路:用字符串保存大整数,转化成高精度保存,注意按万保存需要long long int 型,按千则可以用int型,依次对每个小于M的余数取余,如果为0则说明整除AmodB + CmodB= (A+C)modB 大数1234 0320 %A ==((12原创 2013-01-21 21:32:04 · 242 阅读 · 0 评论 -
POJ2823 单调队列
先定义单调队列: 顾名思义是单调递增或单调递减的队列,队首为队列的最大值或最小值。可以进行的操作:1.队首出队2.队尾进队出队题意: 告诉你一组数组的长度,以及一个固定的区间M。例如 A[ 1.......N] ,固定区间长度为M,问自i=1时起区间A[i.....i+M-1] 中的最大值依次是多少思路:区间最值问题可以用线段树来解决,但是线段树的访问存在对一原创 2013-01-25 00:46:04 · 242 阅读 · 0 评论 -
POJ1204 AC自动机
题意:有一个矩形的字母表,给定N个单词,在字母表中找出单词的起始位置以及单词的方向,用ABCDEFGH表示8个方向,A为North。给这N个单词的构造带fail指针的Trie树。然后从八个方向进行匹配。 在了解KMP算法的情况下学习AC自动机,AC自动机的构造:1.构造一棵Trie,作为AC自动机的搜索数据结构。2.构造fail指针,使当前字符失配时跳转到具有最长公共前后缀原创 2013-01-21 20:10:30 · 264 阅读 · 0 评论 -
POJ3903 最长上升子序列 O(nlogn)
已经知道最长上升子序列的n^2算法DP[i]=Max(DP[j])+1 j 下面介绍优化的算法 用一个Top标记记录当前最长的上升子序列。并用一个数组Num[]记录所有该下标长度的子序列组中,最大值最小的那个值例如有序列 1 2 6 2 3 4 则Num[2]=2 Num[3]=3 Num[4]=4 实现方法:遍历序列,如果当前元素值大于Num[to原创 2013-01-21 21:05:44 · 245 阅读 · 0 评论 -
POJ2195 最大权匹配KM算法
题意:有N个人在一张地图上要回家,问每个人都到家所需要的总的最短距离。 可以用最小费用最大流来做,同样建立一个超级源点一个超级汇点。 但是该图构图后是一个标准的二分图,所以用KM算法来求二分图的最小权匹配。 KM算法:目的:求出边权和最大的完全匹配,给出标号lx[i],ly[j] ,对KM算法的任何时刻有lx[i]+ly[j]>=w[i][j],可以通过找到原创 2013-01-22 15:44:55 · 330 阅读 · 0 评论 -
POJ1191 棋盘分割
题意:将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。 根据定义 极差= 1/n * (Σxi^2 - n*xba^原创 2013-01-23 23:37:45 · 326 阅读 · 0 评论 -
POJ3264 RMQ的ST算法
RMQ问题为求区间最值的问题 线段树可以在O(logN)的时间复杂度内完成询问操作。但是ST算法可以在常数时间内完成询问操作 ST算法:基于动态规划求区间最值的算法。分为预处理和查询两部分预处理:定义 F[i][j] 为从 i开始到 i+2^j-1 区间内的最值 , 我们可以讲这段2^j的区间分成两部分长度都为2^(j-1)的相同区间区间1 为 i.....i+2原创 2013-01-23 21:59:21 · 442 阅读 · 0 评论 -
POJ2983 差分约束系统
题意:告诉你一些关于两地距离的条件,然后判断满足所有条件时的情况是否真实 差分约束系统简析:如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi 可以看到,xj-xi 那么将差分约束系统中的不等式转化成图论中的边例如xj-xi则转化成图中的约束条件 xjxj的一条边,当xj>xi+bk时 xj=xi+bk 进行松弛注意求解时引入一个超原创 2013-01-22 00:43:48 · 255 阅读 · 0 评论 -
POJ2406 KMP算法求循环节
定义循环节为 :某字符串由一个小的字符串重复组成。例如 abcdabcdabcd由abcd重复3次组成,则abcd为原字符串的循环节 由KMP算法中Next函数的定义:若存在Next[ j ] = i ,则有 Str[0.....i-1] == Str[ j -i ......j-1] ,且这个i是所有符合条件的i中最大的i. 定义一个值: j - Next[j] == j-原创 2013-01-23 20:38:58 · 329 阅读 · 0 评论 -
POJ2492 并查集的高级应用
题意:一群臭虫的脑残生活,告诉你臭虫之间的交配关系,问里面是否有gay或les。 用并查集来做Set数组保存集合或父亲节点,Rel数组保存该元素与父亲节点的关系。 每告诉你一对关系,先判断是否在同一集合中,如果不在,则合并两个元素所在的集合,若在同一个集合中,则判断两者是否有不正当的关系。 关系的相互转化:运用到离散数学中二元关系方面的知识 a-c=a-b ^ b-原创 2013-01-23 19:48:26 · 315 阅读 · 0 评论 -
POJ2528 线段树 海报覆盖
线段树题目很多,以这道为例做一个总结 题意:给你若干个海报的覆盖区间范围,并依次覆盖,求出最后能看到的海报数量 解题思路:使用线段树模拟成段覆盖操作,注意要先保存所有的区间离散化后再对线段树进行操作。 离散化思想:借鉴NotOnlySuccess大牛的思想,普通离散化会存在缺陷:给出下面两个简单的例子应该能体现普通离散化的缺陷:例子一:1-10 1-4 5-10原创 2013-01-21 18:12:41 · 251 阅读 · 0 评论 -
POJ1276 多重背包 二进制优化
题意:给定最大的价值,存在N种物品,分别告诉你数量和价值,问这些物品能组成的小于或等于最大价值的价值 即讲物品以2的次方进行划分,假设物品数为34,则划分为1,2,4,8,16,3,5种不同的物品,这5种物品的价值为原物品的数量*原物品的价值,转化成01背包问题 #include#includeint Contain,N;int Amount[11];int Value[原创 2013-01-21 20:41:15 · 244 阅读 · 0 评论 -
POJ2516 最小费用最大流算法
题意:有N个店主, M个供应商和K种物品,已知N个店主需要的K种物品的数量以及M个供应商可提供的K种物品的数量,以及将K种物品从供应商运送到店主所需的花费,求满足所有店主需求的最小的运送花费。 题目的输入比较难以理解,需要仔细考虑边的方向关系。 解题思路:一共有K种物品,每种物品互不影响1.如果出现某种物品的总需求>总供应量,则直接输出不能满足要求。2.依次考虑每种物品原创 2013-01-22 14:02:57 · 307 阅读 · 0 评论