![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法学习
文章平均质量分 78
河洛
这个作者很懒,什么都没留下…
展开
-
poj 3422 费用流
题目描述:题目比较短。选择一个矩阵里,从左上角到右下角的,前k条路径的最大和。解题思路: 和网络流思想类似。因为贪心选择第一条最大之后,继续选择的第二条最大,并不意味着两条和最大。因而需要最大流的反向更新的思想。 构图上,因为网络流的流量,费用是在边上。这里是点。所以需要做拆点构图。代码:#include #include #define N 2原创 2013-05-09 16:52:22 · 447 阅读 · 0 评论 -
poj 1797_迪杰斯特拉
题目描述:道路x->y之间的权值表示允许容量。求从1出发,到达n点的最大允许通过容量为多少。(注意:为无向图)解题思路:做一次迪杰斯特拉。D[i]存1->i的允许通过的容量值。每次选择容量最大的点,选进下一个点后更新点:D[j] = max(D[j],min(D[选择的点], G[选择的点][j]))。更新到n点即可成功退出。若未更新到n点,却发现找不到容量大于0的路,直接退出输出0。原创 2013-05-02 10:24:07 · 424 阅读 · 0 评论 -
poj 1125_迪杰斯特拉
题目描述: 在无向图中进行留言散播。不定起点,边权为一次散播时间。求散播留言到全网的最小时间。解题思路:做v次迪杰斯特拉。每一次求从v点出发消息扩散的全网的最短时间Des[v]。在一次迪杰斯特拉中,求从v点出发到其余各点的最短时间,存到数组D[]中。计算完V到其余各点的消息扩散最短时间后,选择这个v点的D[]的最大值——即扩散到最远节点花费的时间,存为Des[v]。最后再Des[v]中选原创 2013-05-02 10:24:05 · 466 阅读 · 0 评论 -
poj 1062_最短路径
题目描述: 和主人交换物品,物品可以由别人的物品+money来替代。人和人之间交换有等级限制。求怎么能用最少的钱得到和主人交换的那个物品。 转化为问题:(1)节点有自己的权值,边也有权值,若across一个节点,则总权值不用加入该节点的权值,即每条路径的权值 =across的边的权值 + 最后一个点的权值。(2)节点存在等级值,一条路径上的节点等级差不超过m。求从主人那个点出发,最少权值原创 2013-05-02 10:24:03 · 411 阅读 · 0 评论 -
poj3461_kmp
题目描述: 求一个子串在主串中出现的次数。 解题思路: kmp。稍微变一丢丢,就是计算次数而不是只匹配一次,只需要计算next[]索引多往后计算一位:因为如果在最后一位匹配完后的情况,模式串跳转的位置等同于在最后一位的后面那位失效的时候需要跳转到哪里。 一直搞不清楚的kmp这次总算是记住一个大概的思路了。。。。orz。折磨死了。 提交的时候tle了。。后来看discuss里说原创 2013-05-02 10:27:37 · 402 阅读 · 0 评论 -
poj1860_bellman ford
题目描述: 还是货币兑换的题,想找是否货币经过无数次兑换后是否会升值。兑换边符合(兑换货币值-兑换费用)*兑换率。 解题思路: 典型的bellmanford。但是忘了。。。。 复习下bellman-ford首先是带负权值边的图,对于这样的图,如果存在负权回路是没法用djs等求最短路径的,因为每次更新不能确定的最短路径的点(可能由其他大权值的边+一条负权值的边重新更新得到原创 2013-05-02 10:27:34 · 475 阅读 · 0 评论 -
poj_2823_单调队列
题目描述: 有N个数,每次从左到右选取M个数,第一行选取每个区间中的最小值输出,第二行选取最大值并输出。 解题思路: 看单调队列的时候推荐了这个题,所以自然就是单调队列的类型了。然后这个是典型的,固定k区间队列的。套用的本质思想是,如求最小值:考虑这样的一个问题,在某个区间当中如果存在某两个元素A,B,满足A的下标小于B的下标,A的值大于B的值,那么A这个数就可以删掉,不再考虑。原创 2013-05-02 10:26:52 · 408 阅读 · 0 评论 -
poj_1042_贪心+枚举
题目描述: john现有h个小时的空闲时间,他打算去钓鱼。john钓鱼的地方共有n个池塘,所有的池塘沿着一条单向路顺序排列(john每在一个池塘钓完鱼后,他只能走到下一个池塘继续钓),john必须从1号池塘开始钓起,但是他可以在任何一个池塘结束他此次钓鱼的行程。john在每个池塘中每5分钟钓的鱼数(此题中以5分钟作为单位时间),随时间的增长而线性递减。 解题思路: 刘汝佳的书里有。原创 2013-05-02 10:26:50 · 506 阅读 · 0 评论 -
poj_1273_最大流
题目描述: 网络流的标准问题,求最大流。给出边数,点数和边容量。求最大流。 解题思路: 最大流的算法ford_fulkerson,其中求增广路径算法edmonds_karp。两个结合求,注每次更新残留网络边容量时要添加反向的容量,校正用。 这题的数据比较无耻,要注意重边输入需要叠加容量的问题。 代码:#include #include #define M 201#de原创 2013-05-02 10:26:10 · 430 阅读 · 0 评论 -
poj_2739_水题_simple数论?
题目描述: 一个数,可能由几组连续的质数想加的到。这样的连续质数的可能性有几种? 解题思路: 直接循环依次找就好了。连续找质数,如果符合加和=输入则计数。把第一个数单独出来,则令第一个数穷举到2*i 代码:#include #include int isPrime(int n){ int i; for(i=2;i*i if(n%i==0)原创 2013-05-02 10:25:46 · 374 阅读 · 0 评论 -
poj_3259_bellman-ford
题目描述: 有n个点,2m条正权路,w条负权路,求能不能从其中一个点进入,回到自己时走过的路径为负值。 解题思路: 归结为bellman-ford问题。bellman建立在求无负权值回路的最短路径问题上,如果在外层的第n次循环还有点值更新,就说明存在负权值回路,既不能收敛。——这个问题就是检查这个图是否存在负权值回路。 注意:普通路径是双向的!所以数组大小一定要开够。 代原创 2013-05-02 10:25:23 · 421 阅读 · 0 评论 -
poj_1176_枚举
题目描述: 开关灯,指定四组动作(四个按钮)。问在固定次数的按键情况下能达到要求结果(第几个灯开,第几个灯关)的可能性有哪些。 解题思路: 一开始很哈皮的回溯然后就tle了。后来听同学说只有8种情况,所以就用枚举做。代码不负众望地又写地so冗余了……注意:自己很2地算了7种,忘了不变的情况!wa了半天。 代码:#include #include #define N 10原创 2013-05-02 10:25:13 · 490 阅读 · 0 评论 -
poj_1979_递归
题目描述: 就是走黑色瓦片。计算能走过的最多黑色瓦片的数目。 解题思路: 递归。 代码:#include #include #define N 21char G[N][N];int M[N][N],f[N][N];int w,h,pos_x,pos_y,sum;void move(int x, int y){ if(x>= 0 && x< h &&原创 2013-05-02 10:25:11 · 519 阅读 · 0 评论 -
Alice's Piano_回溯
题目描述: 弹钢琴的题。给两个0,1序列。目标是从任一一列开始走,走的过程中可以随时选择走上一列或者走下一列,保证走的过程中,按到的黑白键的数目差值不超过k。从头走到尾,两列都走到尾部时结束。 解题思路: 显然回溯。然后问题是,,不负众望的tle出现了。需要优化。能够优化的地方,就是记录每次失败所处状态,使得下一次回溯回退到同样状态时不需要再进行探索,或者在某一次探索到该状态时就原创 2013-05-02 10:24:58 · 630 阅读 · 0 评论 -
大数计算java
大数加法public static void main(String args[]){ String s = "0"; Scanner input =newScanner(System.in); BigInteger a = newBigInteger("0"); BigInteger c原创 2013-05-02 10:24:41 · 501 阅读 · 0 评论 -
poj 1252_完全背包
题目描述: 凑数字问题。给六个纸币面额,用最少的这六个纸币凑出1-100的面值,求这1-100需要的纸币数种的最大值。 解题思路: 完全背包。要注意的有:(1)可以加和得到,也可以相减得到。加和面额的值需要在相减面额的值之前算好。(2)注意上限…………因为可以相减得到。所以上限需要测试最大的数列,如195 96 97 98 99。 代码:#include #include原创 2013-05-02 10:24:24 · 429 阅读 · 0 评论 -
poj 3624_标准0/1背包
题目描述: 给珠子数量和重量上限,每个珠子拥有自己的属性(重量,charm值)。求在上限之内,令珠子所能达到的最大charm值。每个珠子只能选一次。 解题思路: 标准的0/1背包。两个循环,倒序计算charm值数组。 代码:#include #include #define N 12880main(){ int n, weight; int w[N], c原创 2013-05-02 10:24:22 · 398 阅读 · 0 评论 -
poj 2709_模拟
题目描述: 主要部分就是求一组颜色(每种颜色颜色剩余不同的量)中,三个三个能混合等同于grey颜色。买这样一套的一组颜色(一套就是每种颜色+50),求灰颜色的量,需要由剩余的颜色量,再买几套,可以混合成。解题思路: 把这组剩余的颜色按量排序。每次剩余量最多的三组,每混合一次重新排序一次。(需要注意的是:要按1为单位混合,而不是混合第三组的量)。不能混合后,再加上一套。循环直到混合成功原创 2013-05-02 10:24:11 · 408 阅读 · 0 评论 -
poj 2104_变种快排
题目: 找一列数种的第kth个数。思路: 这个题要求的效率要高一些。如果按照每次选一段数字出来,快排后找kth数,效率不够。但是记录计数连同序号一起记录的话,只只需要排序一次就够了。 代码:#include #include #define N 100001typedef struct{ int data; int index;}ARRAY;ARRAY a原创 2013-05-02 10:24:30 · 506 阅读 · 0 评论 -
poj 1191 搜索+剪枝
题目描述:中文题,棋盘分割。解题思路:搜索所有划分可能。直接搜索肯定会超时,剪枝的思想来源于:计算方差里的变动项为分子的平方求和,而在划分下一格时,由于前面的格子面积已经固定下来,所以可以提前计算面积和平均面积差的平方和,这样就能够提前停止部分无效的搜索状态。貌似有动规做的,递推公式里包含了五维数组。懒得看了。代码:#include #define N 1原创 2013-05-08 16:44:36 · 477 阅读 · 0 评论 -
poj_1080 动态规划
题目描述:求基因组配对的最大的分 解题思路:动态规划。类似编辑距离或者公共子串的思路。第[i][j] 的配对取决于矩阵的左上角三个数。 代码:#include #define N 102#define _MAX(a,b,c)(a>b?(a>c?a:c):(b>c?b:c))int n, m, dp[N][N];char str1[N], str2[N原创 2013-05-06 09:57:09 · 401 阅读 · 0 评论 -
hdu_1978_搜索/动规
题目描述:求从一个方格的左上角,走到一个方格的左下角有几种路。每个方格只能向右/下方向走。路径如下定义:由于每个方格能够走到一定范围(根据能量来定),每次选择一个范围内的目标,然后在目标方格处更新能量值,在其范围内继续选择下一个目标。直到走到右下角。不同的路径为,具有不同途径目标的序列。 思路:1、搜索从左上角开始,搜索能走的下一步,dfs直到找到目标节点,记录路径数。——原创 2013-05-04 16:32:45 · 488 阅读 · 0 评论 -
poj_2777_线段树
题目描述: 在离散段上上色。求覆盖区域的颜色有几种。 解题思路: 基础线段树的建树+修改+查询的过程。注意查询并不一定要找到区间相等,只要包含区间并且有标志颜色即可。修改函数需要注意标记下移的时候需要注意是否原先已经有标记颜色。ps:注意,a可能大于b 代码:#include#include#define L 100001#define T 31typedef st原创 2013-05-02 10:27:29 · 371 阅读 · 0 评论 -
poj3468_线段树
题目描述: 标准的线段树。给出序列操作,分别为对一段区间增值 和求某一段区间和。 解题思路: 标准的线段树建树,修改和查询操作。这里要注意的是,对修改操作为了避免修改到叶子节点而导致的超时问题,令修改到对应的区间即可,而此时为了保证该区间下的节点能够意识到自己的值已经被修改了——通过对该区间打延时标记来实现。 附注:有个坑,就是增量得开到64位long long。 代码:原创 2013-05-02 10:27:20 · 409 阅读 · 0 评论 -
poj2528_线段树+离散化
题目描述: 几张海报有不同的覆盖范围,按先后顺序铺盖上去,看最终在顶层能看到多少张不同的海报。 解题思路: 线段树——还是建树+修改+查询的基本操作。不过费了一天啊。。。有几个需要注意的地方,会容易出现MLE,RE或者TLE的。 首先是线段树标记问题,只标记完全覆盖的区间的tab,其余置空以便最后search求出值,目前自己用过的企另外一种标记方式会TLE;然后就是最重要的离原创 2013-05-02 10:27:12 · 411 阅读 · 0 评论 -
poj_2446_ 匈牙利
题目描述: 找是否能用1*2的板子覆盖掉方格上没有标成黑洞的地方。保证不覆盖板子,能覆盖所有空格 解题思路: 首先,回溯是肯定能做的吧,但是估计会超时。。。 匈牙利的话: 同最大独立集里用的变种的匈牙利算法 ——构建的二分图两边点是相同的,这里的用一块方片覆盖两个格子的条件,等同于是否两点符合配对条件。那么就等同于找这样的二分图里,是否能为所有的点找到匹配方。原创 2013-05-02 10:26:35 · 372 阅读 · 0 评论 -
poj_1422_最小路径覆盖
题目描述: 城市里通过交点->交点(有向)标示一条街道(不存在回路)。问空袭时,需要如何降下最少的伞兵(放到交点路口上),使得伞兵能在不重复走同样交点的条件下,所有的伞兵遍历完整个城市的交叉路口。 解题思路: 最小路径覆盖:用最少的路径覆盖所有点(把有向图转化为二分图+无向边):前提是没有环的有向图。转化为二分图后既为无向边,从左边点到右边点表示了方向。最终找到的匹配边对,代表了右原创 2013-05-02 10:26:33 · 463 阅读 · 0 评论 -
poj_2240_bellman ford
题目描述: 给出货币兑换关系,问是否能用其中一种货币换回更多的值。解题思路: bellman-ford。 回顾下:适用于含负权边的图。可检测图中是否存在负权回路。算法简单描述为做n次边松弛操作,用数组D[]记下每个点处的值。若第n次仍然有边可以进行松弛,则说明存在负权回路。否则该D[]求得从源点s到图G的任意丁点v的最短路径D[]. 这个题要注意自己和自己兑换的情况。同时不原创 2013-05-02 10:26:08 · 400 阅读 · 0 评论 -
poj_1606_回溯
题目描述: 解题思路: 代码:#include #include #define N 1000char print_str[6][20] = {{"pour A B"},{"pour B A"},{"fillB"},{"fill A"},{"empty B"},{"empty A"}};int a, b, n, count, result[N], current[2],原创 2013-05-02 10:25:59 · 379 阅读 · 0 评论 -
poj_1164_递归
题目描述: 给出一个方格描述,其中有些格子互通。求最大互通格子的长度,和一共不互通的格子数目。 解题思路: 求最大互通格子长度,既dfs,可以递归做,结束条件为该格子已经被走过。数有多少个不互通格子,遍历即可。 代码:#include #include #define N 51typedef struct{ int w,n,e,s;}ROOM; //有墙则置原创 2013-05-02 10:25:55 · 430 阅读 · 0 评论 -
poj_1256_回溯
题目描述: 例举字母全排列并打印的问题。 解题思路: 几个注意点:(1)字符串排序问题,符合A(2)删除出现过的字母的问题。回溯做全排列,由于字符串长度最大为13,所以全部存结果排序后删除重复是不可行的,因为13!过大,同时对每个可能的结果串打标记也过大,不可行。考虑在回溯过程中做改动,删除回溯的每一层中重复穷举的情况,因此在回溯函数中设计局部标记数组,标记改字母位于该位置(每原创 2013-05-02 10:25:30 · 454 阅读 · 0 评论 -
决赛B题_The Game_回溯
题目描述: 一个五子连珠的游戏。给定一个10乘10的棋盘和10种颜色的棋子分布图。移动其中任意一个棋子任意步数,求这样做一次动作最多能得到多少分。 解题思路: 回溯。要注意一些细节问题,诸如计算得分时注意多组交叉加分的情况。另外就是输出格式…… 代码:#include #include #define N 11int G[N][N],max=0,flag[N][N];原创 2013-05-02 10:25:17 · 429 阅读 · 0 评论 -
poj_1129_地图着色?
题目描述: 信道分配。好吧我不能理解这个题分配信道判断干扰的机制,总而言之这个题意就是指地图着色了。。。就是希望相邻的两个点不能同色即可。 解题思路: 地图着色。遍历点,将着的颜色记录,并标识邻居不能用该色。遍历完所有点即可。 代码:#include #include #define N 27int G[N][N], color[N][N];main(){ c原创 2013-05-02 10:25:15 · 461 阅读 · 0 评论 -
poj_1154_回溯基础题
题目描述: 给一个矩阵列,矩阵元素为大写字母。起点为矩阵第一行第一列那格。看看走不重复的字母最多能走多少格。 解题思路: 回溯,没啥好说。。。 代码:#include #include #define N 21char str[N][N];int max=0,f[27];int r,c,count;void find(int i, int j){ if(i原创 2013-05-02 10:25:05 · 394 阅读 · 0 评论 -
poj 1014 _ 多重背包
题目描述:有1-6重量的物品。给出一个数列分别代表这些重量的物品的数量。求这些物品是否能被平分为两堆等重的物品。 解题思路:把总重量的一半作为容量上限,把重量作为判定价格。定义F[v]为最接近v重量的物品能凑成的重量。 代码:#include #include #define V 60200int f[V];main(){ int set[7]; int s原创 2013-05-02 10:24:45 · 402 阅读 · 0 评论 -
poj 3628_0/1背包
题目描述: N只奶牛,每只奶牛拥有属性(height),书架高度B。求令奶牛叠加高度正好能够超过书架,并且超过值最小的那个excess高度。 解题思路: 也是0/1背包,稍微有点变化的是容量上限值为(最大奶牛高度+书架高度)。最优子结构依旧是达到h高度时,最接近书架高度的奶牛迭加高度。 代码:#include #include #define N 21#define M原创 2013-05-02 10:24:20 · 395 阅读 · 0 评论 -
poj 1789_prim
题目描述: 字符串看做点,字符串之间距离(不同字符的个数)看做边权。求1/最小生成树值。解题思路: 水题。就是求最小生成树。这里面应该是点数明显少于边数的,所以选prim。代码:#include #include #define N 2001#define Infinity 7char input[N][8];int G[N][N];int visit[N], D[原创 2013-05-02 10:24:09 · 419 阅读 · 0 评论 -
poj1068_模拟
题目描述: S (((()()())))P-sequence 45 6666W-sequence 11 1456p_seq代表遇到右括号时,左括号的数量;w_seq表示遇到右括号时,算上自己和包含在匹配的括号里的一共匹配的括号有几对。给出p_seq,求w_seq。 解题思路: 觉得自己的方法好绕口啊。。 最原始的想法就是用p_seq还原序列然后用原创 2013-05-02 10:27:39 · 479 阅读 · 0 评论 -
boj332_可恶的麦兜_线段树
题目描述: 废话略多。。。其实就是对一组数列里面的每个数做修改和对区间总数查询。 解题思路: 如果用线段树的话就是很传统的线段树思想。建树,查询区间,做标记修改。 代码: #include#include #define N 100001#define M 50001typedef struct{ int l,r; int tab;}CH;CH原创 2013-05-02 10:27:10 · 583 阅读 · 0 评论 -
poj2352_线段树
题目描述: 给出一个根据星星所处坐标位置来计算星星等级的规则。求位于每个等级的星星的个数。 解题思路: 思路一:不用线段树的话,就是直接计算x坐标序列的序号:即遍历x,计算当前x之前有几个数小于等于自己(二分找),记为当前数所处的level。最后统计一下即可。这个是个线性的查找法,所以复杂度是n平方。 思路二:用线段树的话,基本思路就是把建立区间树,然后计算的等级等于遍历x序原创 2013-05-02 10:27:08 · 439 阅读 · 0 评论