摘要:马草AC了简直是各种爽啊,而且算法里只用了两次LIS,算法整体复杂度O(nlogn)真的是应了老乔那句至简至繁至简,思考了一整天,还是直接用两次LIS外加两个辅助数组就解决了问题思路就是,要真的深入地思考清楚这个问题,真的深入理解了LIS而不仅仅是套模板,套模板的结果就是把复杂度弄成O(n^2log...
阅读全文
摘要:dp经典关于这道题,我看了网上大量的资料,发现整体思路是对的,但是细节解释是错的(或者说不到位)Len = strlen(say); say是牛说的话,下面的word代表单词列表dp[i]表示从say中第i个字符开始,到第Len-1个字符(结尾处)这段区间所删除的字符数,初始化为dp[i]=len-...
阅读全文
摘要:---恢复内容开始---这道题就是明显的完全背包题啦,只不过物品的重量和价值是一样的。我就是按照《背包九讲》中完全背包的思路,先把物品的数量 ni 按照1,2,4,8...的规律分解,然后直接用简单背包暴力数据比较小,10种物品,每一种最多1000个,cash 2 #include 3 using ...
阅读全文
摘要:思路是枚举第一个字符串中所有长度大于三的字串,再用KMP在其他串中验证是否存在这个字串,取最长字母序最小者代码: 1 #include 2 #include 3 using namespace std; 4 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 16 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) ) 17 #def...
阅读全文
摘要:匈牙利二部匹配的裸题,算法思想我是懂了,但是代码为什么可以那样写我还没想明白。鉴于过几天要比赛了,所以先拿别人的模板来用。 1 #include 2 #include 3 using namespace std; 4 5 #include 6 #include 7 #include 8 #include 9 #include10 #include11 #include12 #include13 #include14 15 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) )16 #define repAE(p,q,i) for( ...
阅读全文
摘要:首先要吐槽一下杭电,错误的代码都能过,而且这种情况不止一次了。第一次最大流,纪念一下。就是用的Edmonds-Karp,自己的模板,详细资料参考《算法导论》第26章最大流。题意就是给N条有向路径,M个节点,1为源点,M为汇点,求最大流裸题。直接上代码,代码中,最开始,我初始化和搜索中的范围都是[1,N],在HDU交,居然AC。后来在POJ WA地不明所以,才发现这个错误。注意判重边。 1 #include 2 #include 3 using namespace std; 4 #include 5 #include 6 #include 7 #include 8 #includ...
阅读全文
摘要:转自人人:http://blog.renren.com/blog/253608280/431599824这两天做了几个线段树的题目 与大家分享 欢迎补充难度系数 分为从1 到 5 (只对初学者有用 对大牛来讲 这些题的难度系数都是0..)http://acm.pku.edu.cn/JudgeOnli...
阅读全文
摘要:这道题就没什么好说的啦,直接dijstra最短路。把所有石头之间的距离求出来制图,dijstra最短路。上代码 1 #include 2 #include 3 using namespace std; 4 #include 5 #include 6 #include 7 #include 8 #include 9 10 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) )11 #define repAE(p,q,i) for( int (i)=(p); (i)=(q); --(i) )14 #define range 21015 1..
阅读全文
摘要:这道题也学到了不少东西。题目链接:http://poj.org/problem?id=3259题意就是一块地上有n个区域,m条路径,有w个虫洞,要你求能不能从某个区域开始然后经过某种路径,最后回到该区域,而此时的时间在离开的时间之前。明显的Bellman,可是如何处理呢?好吧,既然题意是说从某个区域,意思是图中只要有负环就可以了,而只要有负环那么Bellman算法中的n-1次松弛就必然能完成。所以关键在于检验是否能进行n-1次松弛。上代码 1 #include 2 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) ) 3 #defin.
阅读全文
摘要:这题还是学到了一点东西吧。题目链接:http://poj.org/problem?id=1860题意就是有N个货币兑换点,每个点提供A,B两种货币的兑换。假设现在手上有货币A,数量为Q,那么兑换成货币B的话就能得到(Q-Cab)*Rab 个B货币。初始货币为S,数量为V,求能不能通过一系列兑换,增加S的数量。这个就是最短路,用Bellman-Ford算法拉,松弛后看图中有没有正环(因为要增加货币数量)。不过不需要松弛n-1次,可以在松弛的过程中看,此时的图G能不能提供松弛的边,如果不能就直接跳出n-1的循环。关键在于松弛条件:dis[ fun[j].f ] - fun[j].c ) * fun
阅读全文
摘要:裸的prim,不解释,直接上代码。 1 #include 2 #include 3 using namespace std; 4 #include 5 #include 6 #include 7 #include 8 #include 9 10 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) )11 #define repAE(p,q,i) for( int (i)=(p); (i)=(q); --(i) )14 #define range 51015 struct node{16 int f,t,dis;17 ...
阅读全文
摘要:裸的prim,不解释,直接上代码。#include#includeusing namespace std;#include#include#include#include#include#define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) )#define repAE(p,q,i) for( int (i)=(p); (i)=(q); --(i) )#define range 510struct node{ int f,t,dis; node(){} node( int _f , int _t , i...
阅读全文
摘要:裸的最小树。题目链接:http://poj.org/problem?id=1789题目意思就是,所有的物品标号都有唯一ID,从P衍生到Q的花费是PQ编号中在同一位置而字母不同的个数。直接用两层循环求出点对之间的最短路,krustra。上代码。 1 #include 2 #include 3 using namespace std; 4 #include 5 #include 6 #include 7 #include 8 #include 9 10 #define repA(p,q,i) for( int (i)=(p); (i)!=(q); ++(i) )11 #define repAE(.
阅读全文
摘要:最小生成树的题,这道题做得我快吐了,必须总结一下。题目链接:http://poj.org/problem?id=3026一开始我就看错了题,以为我方在任意位置都可以分裂,直接导致想不出来。后来搜了下,才发现看错题了。题意就是给一个地图,要求从S开始,能经过所有A的最短路径。而且我方能够在S点或任意A点分裂成任意多个队列同时寻找A点。果断BFS+prim啊,用bfs求出S和所有A之间 点对的最短距离,在用prim就好了。不过方法很显然,不过我却TLE了好几次,都快恶心死了。原因是我bfs用的是queue,和node结构体,然后就各种TLE啊。后来全部改用数组就行了。事实证明数组比STL快得多。.
阅读全文