代码改变世界

杭电ACMstep 3.2.1

2013-11-30 12:49 by 凝月流风, 212 阅读, 0 推荐, 收藏, 编辑
摘要:题目是最大子序列和问题,跟以往的不同是和可以是负数,所以只需要改一下求最大子序列和的代码即可,依然是O(n)的时间复杂度 思路是从左向右不断地找出每一个有可能成为最大和的子序列,用submax保存,每一次将它与Max进行比较更新Max submax的寻找方法是当前面序列a[i] ~a[j] 段的submax为负数时,将前面这段抛弃,另起炉灶,使submax = a[j+1],因为前面的负数部分只会 使submax减小,所以将其抛弃(需要注意的是题目可能有多种情况,找出第一种,所以submax=0时还得保留) 另外编程珠玑上面讲这个问题的几种解决方式讲的很详细,递归虽然要O(n*logn)的复. 阅读全文

codeforce 358D - Dima and Hares 动态规划

2013-11-20 00:02 by 凝月流风, 372 阅读, 0 推荐, 收藏, 编辑
摘要:一开始看到题目以为是最大能量项链一样的动规问题,但按照那种划分的话情况非常混乱,而且时间复杂度很大,所以行不通 因为某只hare的joy只有周围两只是否feed相关,所以可把n只hare的最大值分解为前n-1只1)在第n只之后feed的最大值 2)在第n只之前feed的最大值 再加上第n只对应的值。 因为前n-2只与第n只毫无关系,所以可以当做把他们先喂完。 然后再以此往前类推即可。 然后将递归转化为从头开始递推就可以了,,所以只要求出在第k项在第k+1项后feed时前面k项的最大值以及第k项在第k+1项之前feed时的最大值即可。 状态转移方程为 : dp[i][0] = max(dp[i. 阅读全文

Poj2516 最小费用最大流

2013-08-08 23:14 by 凝月流风, 588 阅读, 0 推荐, 收藏, 编辑
摘要:题目讲的是要从M个货源地提供K中商品个N个店主,不同的店主对不同商品的需求量不同,不同货源地K中商品的存货量也不同,第k种商品从货源地v到店主u的单位商品运输费用也不同,要求出满足所有店主要求的最小运输费用,若无法满足则输出“-1”。 我的想法是对于每一种商品分开处理, 每一种商品的运输费用都达到最小即可得到总费用最小,一个大循环for(i= 0; i 2 #include 3 #include 4 using namespace std; 5 const int MAXN = 110; 6 const int INF = 0x7FFFFFFF; 7 int cap[MAXN][MAXN... 阅读全文

POJ1149最大流

2013-07-30 22:12 by 凝月流风, 230 阅读, 0 推荐, 收藏, 编辑
摘要:难度在于建图,剩下的就是求最大流问题了。 贴上我的实现代码 //题目的难度在于如何建图,将每一个客户当做点,另外添加一个源点s和汇点t,每个客户点建一条有向边指向汇点t,容量为该客户要购买的猪的数量; //若客户i是猪圈j的第一个访问者,则从源点s建一条边指向节点i,容量为猪圈的初始猪数,若客户i不 阅读全文

强连通分量2-Tarjan算法 POJ1236

2013-07-29 14:14 by 凝月流风, 225 阅读, 0 推荐, 收藏, 编辑
摘要:这两天学习了一下求强连通分量的另一个算法Tarjan算法,相比于之前的Kosaraju算法,Tarjan算法只需要进行一次深搜即可,两个算法的时间复杂度都是O(n+m); 算法基本思路是:从任一顶点开始进行深搜,强连通分量是一棵搜索子树,在搜索是将每一个未处理的点弹入栈中,然后在回溯时判断以该节点为根的搜索子树是否为一个强连通分量,若是,则将栈顶至该节点的元素弹出,这些元素即构成一个强连通分支,然后继续回溯,遇到强连通分量则弹出,最终便可获得有强连通分量。 算法的关键在于如何判断以u为根的搜索子树是否为一个强连通分量,算法用一个DFN[u]记录节点u在深搜时的次序,并用一个Low[u]记录u. 阅读全文

强连通分量(Kosaraju算法)学习笔记

2013-07-27 14:30 by 凝月流风, 536 阅读, 0 推荐, 收藏, 编辑
摘要:把一个图分解为各强连通分支(strongly-connected-component)是深度优先搜索的一个经典应用,下面就是如何使用深搜来将一个有向图分解为各强连通分支。Kosaraju算法需要用到两次深搜,基本方法为:第一次深搜记录下各顶点搜索完成时的时间戳f[x](看到网上有人是用vector存放顺序是一个更好的改善),然后将原图G的边反向得到逆图G‘,接着对该逆图进行第二次深搜,跟第一次不同的是这一次搜索是根据之前得到的时间戳从大到小进行搜索(下面我将同一个强连通分支的顶点在同一行中输出,使用邻接矩阵表示图G和G’,但是邻接矩阵在做题时容易爆内存,可用连接表等代替之) C语言代码如下:# 阅读全文

ZOJ1117 第一次写赫夫曼编码

2013-05-19 13:57 by 凝月流风, 201 阅读, 0 推荐, 收藏, 编辑
摘要:1 #include <stdio.h> 2 #include <queue> 3 #include <iostream> 4 using namespace std; 5 struct Node { 6 int f; 7 // int height; 8 int parent; 9 bool visited;10 }node[100];11 12 int num, r;13 void getSmallestTwo (int &t1, int &t2){14 int i, min = 99999999;15 for (i = 0; i < 阅读全文