推荐题型
文章平均质量分 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 · 543 阅读 · 0 评论 -
网赛题解
成都赛区:1001:线段树1002:最大流1003:1004:矩阵相乘1005:最大流1006:区间DP1007:1008:DP1009:贪心1010:原创 2012-09-19 10:13:32 · 1304 阅读 · 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 · 1080 阅读 · 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 · 875 阅读 · 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 · 759 阅读 · 0 评论 -
HDOJ 4271 Find Black Hand(最短编辑距离)
/*A一道题,真心觉得不容易,各种情况要考虑。不过是一道经典DP问题首先这道题,是一道最短编辑路径问题,很久以前做过这类问题,一直没做了,所以看到这道题时候根本没有往DP方面想。d[i][j]表示,母串ss[i]得到子串s[j]的最小编辑次数,并且i与前面的操作相连。然后这道题,可以出现环,具体处理将母串复制一遍添加到后面。但是同一个字母不能用多次,所以需要分情况处理。比如母串:abcd原创 2012-09-15 21:41:57 · 1071 阅读 · 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 · 1115 阅读 · 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 · 547 阅读 · 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 · 976 阅读 · 0 评论 -
POJ 2528 Mayor's posters(离散化+线段树)
/*这道题,真的做了很久,终于AC。①原来使用哈希判重,结果超时,其实一次历遍就行②在search()函数中,需要考虑查找成功和失败两种情况,失败情况容易忽略③其实对于“区间更新”问题,算法不存在错误,可以作为模版。至于A[l] ++ , A[r + 1] --,这个只能处理求和问题,实际对效率无太大影响,只是多一个log(n)④离散化处理的第一道问题,两重for()循环即可,一个判重原创 2012-09-03 19:19:38 · 1098 阅读 · 0 评论 -
POJ 1035 Spell checker(哈希表)
/*题意:输入字典,然后输入单词,判断字典中是否出现过该单词,或者是否进行删除、添加、替换操作,如果是,则输出对应的字典中的单词要求按照输入时候的排名输出题解:建立两个哈希表。一个存储字典和输入字典中单词的排名,一个进行最后输出的判重*/#include //#define using namespace std;const int HASH = 12007;char lis原创 2012-08-18 10:16:13 · 1084 阅读 · 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 · 811 阅读 · 0 评论