上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 85 下一页
  2012年8月28日
摘要: HDU_2234 这个题目可以先从终态出发,把5步以内的所有状态预处理出来,同时为了进一步减少状态,利用最小表示法的思想,将终态看成只有两种:1111222233334444和1234123412341234,这样我的程序最终跑出来就只有157370个状态了。 在查询的时候,由于前面我们用最小表示法将状态简化了,那么现在就要将1、2、3、4全排列一下生成24种状态,每种状态都查找一下,然后取这24种状态下的最小值。#include<stdio.h>#include<string.h>#include<algorithm>#define HASH 100000 阅读全文
posted @ 2012-08-28 14:46 Staginner 阅读(269) 评论(0) 推荐(0) 编辑
摘要: HDU_1430 一开始以为只是个简单的bfs,结果发现写完超时,也就是说虽然总状态不多,但case很多,为了应对这样的情况比较好的办法就是预处理出来,然后O(1)查询并递归打印操作。 如果想预处理出来的话,那么必须要么固定起点,要么固定终点,由于这个题目要字典序最小,固定起点更方便。接着就是要将每个case转化成同一个起点就可以了。#include<stdio.h>#include<string.h>#define HASH 100007#define MAXD 100010int op[][8] = { {7, 6, 5, 4, 3, 2, 1, 0}, {3, 0 阅读全文
posted @ 2012-08-28 13:12 Staginner 阅读(358) 评论(0) 推荐(0) 编辑
摘要: HDU_3278 尽管如果考虑有三种颜色的话状态数会很多,但如果一旦确定我们要将哪个颜色移到中间,其余的两个颜色就可以视作一种颜色,因此就可以先从终态开始bfs一遍,记录下结果,每次读一个图,就枚举三种颜色当作移到中间的颜色,然后O(1)查询步数即可。#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define HASH 1000007#define MAXD 1000010#define INF 0x3f3f3f3fstruct Point{ int s 阅读全文
posted @ 2012-08-28 10:24 Staginner 阅读(180) 评论(0) 推荐(0) 编辑
摘要: HDU_3638 如果除去怪物的话这个题和普通的BFS走迷宫没太大区别,因此不妨将怪物看得相对分离一点,每到一秒先将怪物的视野处理出来,然后这一秒既不走到怪物的视野内又不走到*的位置即可。 在处理怪物的视野时,可以先用一个结构体存储怪物的方位,每过一秒就自动更新怪物的方位,再打一个包括4个方向且每个方向上有9个相对位置的表,这样就比较好处理出怪物的视野了。#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define MAXN 60int trans[] = 阅读全文
posted @ 2012-08-28 00:30 Staginner 阅读(295) 评论(0) 推荐(0) 编辑
  2012年8月27日
摘要: HDU_3681 由于Y和G加起来不到15个,那么可以预先将F、Y、G之间的最短路处理出来,然后化归成TSP问题来做。#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define MAXD 20int N, M, dis[MAXD][MAXD], g[MAXD][MAXD], mark, Y, G, sx, sy, vis[MAXD][MAXD];int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};char b[M 阅读全文
posted @ 2012-08-27 22:28 Staginner 阅读(453) 评论(0) 推荐(0) 编辑
摘要: HDU_2757 由于边权只有0和1,可以用稍加变形的BFS,也可以直接用优先级队列,由于后者省事一些,所以就直接用优先级队列来写了,不过当然效率也会低一些。#include<stdio.h>#include<string.h>#include<queue>#define MAXD 1010#define INF 0x3f3f3f3fchar b[MAXD];int N, M, dis[MAXD][MAXD], g[MAXD][MAXD], sx, sy, tx, ty;int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1}, dy[] 阅读全文
posted @ 2012-08-27 17:16 Staginner 阅读(196) 评论(0) 推荐(0) 编辑
摘要: HDU_2890 在罗穗骞的论文里有说过至少重复K次的可重叠的最长子串该怎么找,只不过这个题改成了不可重叠。我用的是比较暴力的办法,把按height值分组之后每组内sa[i]的值提取出来排个序,然后扫一遍看能不能形成至少K个不重叠的子串。 此外这个题有两个大坑:①题目中所谓的subsequence应该是substring,在HIT的OJ上这个题目的描述就都是用的substring;②所谓的字典序可能会带来歧义,比如结果有两种可能5100和599,如果将整数当成字符串来处理显然是5 100应该字典序更小,因为100的字典序比99小,但就这个题目而言应该是5 99的字典序比较小,也就是说要把每.. 阅读全文
posted @ 2012-08-27 15:10 Staginner 阅读(494) 评论(0) 推荐(0) 编辑
摘要: HDU_2704 由于N很小,离散化之后暴力对每块格子染色应该都能过。效率比较好的办法之一是用线段树+扫描线来做(当然也可以离散化,不过这个题目W、H比较小,所以可以不必离散化),在线段树上记录当前扫描线上当前区间被覆盖的次数cnt,扫描线上被覆盖的长度len,被覆盖的最大深度dep,以及被覆盖的深度最大的部分的长度ml就可以了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 210#define MAXD 40010int N, W, H, dep[4 * MAXD], 阅读全文
posted @ 2012-08-27 11:30 Staginner 阅读(238) 评论(0) 推荐(0) 编辑
摘要: HDU_1199 根据数据的范围感觉离散化之后暴力染色也是可以的,更好一点的办法就是用线段树优化染色操作,最后将所有的标记都下传到叶子节点之后,再顺序扫一遍各个区间就可以得到结果了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 4010#define INF 0x3f3f3f3fint N, tx[MAXD], to[4 * MAXD], X, color[4 * MAXD];struct List{ int x, y, c; }list[MAXD];void build 阅读全文
posted @ 2012-08-27 10:19 Staginner 阅读(262) 评论(0) 推荐(0) 编辑
  2012年8月26日
摘要: HDU_1733 分层图网络流。为了保证每秒钟每个地方只站一个人,可以把每个点i拆成i和i'并连一条容量为一的边。分层图中每一层都表示一秒钟的站位情况,然后不断地增加图的层数,直到最大流等于人数为止就可以得到最小的时间了。 至于-1的情况可以一开始用搜索预处理出来。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 20#define MAXD 60010#define MAXM 420010#define INF 0x3f3f3f3fint N, M, first[M 阅读全文
posted @ 2012-08-26 23:57 Staginner 阅读(297) 评论(0) 推荐(0) 编辑
上一页 1 ··· 7 8 9 10 11 12 13 14 15 ··· 85 下一页