推荐题型
文章平均质量分 74
omsobliga
这个作者很懒,什么都没留下…
展开
-
HDU 1010 Tempter of the Bone(奇偶剪枝)
/* 题意:从S到D,能否在T时刻到达 主要使用奇偶剪枝 主要收获: ①奇偶剪枝 ②尽量减少scanf("%c", &c);的使用 */ #include #include #include using namespace std; const int nMax = 8; char map[nMax][nMax]; int visit[nMax][nMax]; int n, m, t;原创 2012-08-16 22:25:11 · 522 阅读 · 0 评论 -
网赛题解
成都赛区: 1001:线段树 1002:最大流 1003: 1004:矩阵相乘 1005:最大流 1006:区间DP 1007: 1008:DP 1009:贪心 1010:原创 2012-09-19 10:13:32 · 1282 阅读 · 0 评论 -
hdu 4417 Super Mario(线段树)
/* 首先对问题进行转换,将数据分别用数组做存储,按h大小进行排序,然后从小到大进行询问操作,每次操作之前,首先将第一个数组中h值比这个值小或等于的入队, 于是问题转换为线段树问题 */ #include #include #include using namespace std; const int nMax = 100007; struct Tree { int l, r;原创 2012-10-09 17:28:31 · 1065 阅读 · 0 评论 -
HDOJ 4288 Coder(线段树)
/* 线段树很强大,这个应该也属于区间处理、多次查询的问题,所以要用到线段树解决。 sum[]分别表示区间内%5余数之和,cnt表示区间内总个数 首先离散化,然后建立线段树(让线段树中l,r与A[]数组相对应起来),然后添加和删除元素即可 */ #include #include #include const __int64 nMax = 100007; __int64 N; struc原创 2012-09-19 11:53:37 · 854 阅读 · 0 评论 -
HDOJ 4291 A Short problem(Fib矩阵相乘)
/* 类似fib数列,矩阵相乘,取模,所以肯定会出现循环节,不知道为什么一定是从0、1开始循环的 */ //求循环节 #include #include const __int64 M = 222222224; using namespace std; __int64 a[4], b[4]; int main() { set se; __int64 i; __int64 f1 = 1原创 2012-09-18 10:49:19 · 740 阅读 · 0 评论 -
HDOJ 4271 Find Black Hand(最短编辑距离)
/* A一道题,真心觉得不容易,各种情况要考虑。不过是一道经典DP问题 首先这道题,是一道最短编辑路径问题,很久以前做过这类问题,一直没做了,所以看到这道题时候根本没有往DP方面想。 d[i][j]表示,母串ss[i]得到子串s[j]的最小编辑次数,并且i与前面的操作相连。 然后这道题,可以出现环,具体处理将母串复制一遍添加到后面。 但是同一个字母不能用多次,所以需要分情况处理。比如母串:abcd原创 2012-09-15 21:41:57 · 1057 阅读 · 1 评论 -
HDOJ 4276 The Ghost Blows Light(最短路+树形DP)鬼吹灯问题
/* 参考:http://nightelf.sinaapp.com/2012/hdu-4276.html 鬼吹灯问题 题意:每个坟墓都有一些珠宝,从一个坟墓到另一个坟墓需要耗费掉一定的时间,问从1到N,在规定时间T内,最多可以得到珠宝数 思路:最短路+树形DP,找出从1到N的最短路,因为任何两点间只有一条路,所以最短路中所有边都为必走的边。所以从1到N的路径,都为最短路, 然后加上从最短路中某些个原创 2012-09-11 20:40:38 · 1103 阅读 · 0 评论 -
POJ 1185 炮兵阵地(状态压缩)
/* 推荐:经典状态压缩 我原来四进制表示,结果果断超时! 解题关键:假设一行所有列均为P,将所有可行状态,存储到数组A[]中,经过计算,状态最多有60种,然后再进行DP。否则很容易超时。 d[i][j][k]:表示第i-1行状态为j,第i行状态为k,最大炮兵数。 如果只是d[i][j],则无法从前面状态推导,虽然前两行状态可以知道,但会存在冲突。 而d[i][j][k]则可有效避免,因为前两行原创 2012-09-12 20:57:26 · 531 阅读 · 0 评论 -
HDOJ 1024 Max Sum Plus Plus 最大K段子序列和(01背包 + 滑动数组 + 优化)
/* /* 超时。 题意:输出m个子序列和的最大值 思路:动态规划 + 滑动数组 d[m][j] = max(d[m][j - 1] + e[j], max(d[m - 1][k] + e[j]) | k ∈ [m -1, j)). 表示前j个序列分割成m组,最大序列和 因为状态方程中只用到d[m]和d[m - 1]两个状态,所以只需要一个二维数组即可。 优化:至于max(d[m - 1][k原创 2012-08-07 15:36:59 · 947 阅读 · 0 评论 -
POJ 2528 Mayor's posters(离散化+线段树)
/* 这道题,真的做了很久,终于AC。 ①原来使用哈希判重,结果超时,其实一次历遍就行 ②在search()函数中,需要考虑查找成功和失败两种情况,失败情况容易忽略 ③其实对于“区间更新”问题,算法不存在错误,可以作为模版。 至于A[l] ++ , A[r + 1] --,这个只能处理求和问题,实际对效率无太大影响,只是多一个log(n) ④离散化处理的第一道问题,两重for()循环即可,一个判重原创 2012-09-03 19:19:38 · 1083 阅读 · 0 评论 -
POJ 1035 Spell checker(哈希表)
/* 题意:输入字典,然后输入单词,判断字典中是否出现过该单词,或者是否进行删除、添加、替换操作,如果是,则输出对应的字典中的单词 要求按照输入时候的排名输出 题解:建立两个哈希表。一个存储字典和输入字典中单词的排名,一个进行最后输出的判重 */ #include //#define using namespace std; const int HASH = 12007; char lis原创 2012-08-18 10:16:13 · 1068 阅读 · 0 评论 -
HDU 4283 You Are the One(区间DP)
/* 这道题才真正接触到区间DP的思想 d[i][j]:表示从第i个到到第j个人的最小值,那么第i个人可以是第一个出,也可以是最后一个出,假设是第k个出,则 区间可分为[i + 1, i + 1 + k - 1 - 1],d[i + k, j]前者肯定是在k之前出,后者在k之后,于是转换为区间DP问题 其中需要对后者做一下处理,加上(k - 1) * (sum[j] - s[i + k - 1])原创 2012-09-21 20:25:05 · 790 阅读 · 0 评论