![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
POJ
文章平均质量分 66
omsobliga
这个作者很懒,什么都没留下…
展开
-
POJ 2411 Mondriaan's Dream(DP---状态压缩)
/* 推荐:五星 动态规划、状态压缩、dfs 题意:m*n矩形,要求使用2*1的小块矩形进行填充,共存在多少种方法。 解题思路:使用1、0对每一格进行填充,首先考虑只有两行,则存在三种情况:竖着放置第i行为1,第i+1行为0;横着放置第i行为11,第i+1行为11;第i行正好为上一行竖着放置凸出来的部分,则第i行为0,所以下面一行肯定为1。使用d[i][s]表示第i行为状态s时的最大放置方原创 2012-05-02 16:35:54 · 694 阅读 · 0 评论 -
POJ 3630 Phone List(Trie树,静态数组实现)
/* 这道题动态分配内存会超时 先建图,建图完成后,再判断,这样不容易出错 */ /* 解法一: Trie树,静态数组实现 */ #include #include const int nMax = 200000; struct Trie { Trie *next[10]; int count; }trie[nMax]; int pos; void buildTrie(char *原创 2012-09-03 20:46:07 · 782 阅读 · 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 1088 滑雪(动态规划+记忆化搜索)
//动态规划 + 记忆化搜索 #include #include const int nMax = 107; int R, C; int map[nMax][nMax]; int dp[nMax][nMax]; int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0}; int fdp(int x, int y) { if(dp[x][y] != 0) ret原创 2012-09-05 19:09:34 · 800 阅读 · 0 评论 -
POJ 1157 LITTLE SHOP OF FLOWERS(动态规划)
/* 题意:每行选一个数,下一行选得数只能在这一行后面,求选出所有数的最大和。 很容易的一道题,原来只使用了一个数组d[],结果运算中出现很多情况,而且最后发现思路根本就是错误 然后增加一个数组d1[],问题变得很容易。 状态转移方程:d[i][j] = max(d[i - 1][k] + map[i][j]),i - 1 <= k < j; d[i][j]表示加入只有i行,第i行必须选择第j列时原创 2012-09-05 20:13:22 · 626 阅读 · 0 评论 -
POJ 2353 Ministry(双向DP)
/* 题意:矩形M*N,要求:只能向下、向左、向右走,求从第一层到最后一层费用最小的路径。 思路:双向DP(其实就是两个for循环),因为最佳路径只有三种从上、从左、从右,所以只需要三个循环即可 原来使用Dijskra中寻找最短路径的方法,果断超时! */ #include #include const int mMax = 107; const int nMax = 507; int m原创 2012-09-06 16:52:59 · 1255 阅读 · 1 评论 -
POJ 1947 Rebuilding Roads(树形DP + 01背包)
/* 01背包(最小价值) + 树形DP,做的第一道树形DP问题 思路:d[i][j]:以i为跟的树,选j个节点,根必选 原来一直Runtime Error,最后发现①处的问题,漏了N */ #include #include const int nMax = 157; const int INF = 0x3fffffff; int next[nMax]; int head[nMax]; in原创 2012-09-08 21:43:27 · 616 阅读 · 0 评论 -
POJ 2486 Apple Tree(树形DP + 01背包)
/* 树形DP + 01背包 思路:首先bfs将图转变为树,然后dfs进行动态规划。有两种状态,其中d[0][i][j]表示直通,d[1][i][j]表示返回到i节点 ①、②处,曾经出错 临界状态的初始化,始终感觉是个难点,一直没有搞清楚。最后在测试数据 1 1 1 的时候发现问题。 */ #include #include const int nMax = 107; const int mM原创 2012-09-08 21:24:50 · 594 阅读 · 0 评论 -
POJ 2411 Mondriaan's Dream(状态压缩)
/* 正常求解超时,然后打表通过。 自己定义状态,我的解法横木块[0,0],竖木块[1,0],其中1表示下层。 也可以横木块[0,0],竖木块[1,2],不过会多出一个状态,需要3进制表示。 */ //打表程序 #include #include __int64 h, w; __int64 d[11][1 << 11]; __int64 check1(__int64 x)//相连的0必须为原创 2012-09-13 10:31:09 · 963 阅读 · 0 评论 -
POJ 3461 Oulipo(KMP求匹配次数)
/* 题意:求某一单词在句子中出现的次数。 做这道题的时候,匹配算法搞了很久,最后终于想明白了,受传统模式匹配算法的影响,认为①处也需要对i做一次变化。 */ #include #include #include using namespace std; const int wMax = 10010; const int tMax = 1000010; char s[wMax], ss[原创 2012-08-23 22:22:22 · 661 阅读 · 0 评论 -
POJ 2823 Sliding Window(单调队列)
/* 单调队列 适合解决的问题,多次查询k个连续序列中最大或最小值。可以将复杂度从O(n*n)缩短到O(n)。 实现模式:队列实现,只不过其中元素单调(依次增大或减小),我们假设求最大值。入队时比较队尾元素与插入元素的大小,如果队尾元素小与插入元素,则对尾元素出对,直到大于等于位置。 这样插入k个元素后,队列中队首即为最大值。继续进行第二次查询时,需要比较队首元素在原来元素中的位置,判断是否在这次原创 2012-08-09 11:29:44 · 465 阅读 · 0 评论 -
POJ 3250 Bad Hair Day(单调队列)
/* 题意:第i头牛,只能看到它右边比他矮的牛的牛头,问所有的牛能看到牛头总数 题解:从后往前搜索,队列中存储牛的最高身高,到第i头牛的时候,对队列进行一次搜索,找到比第i头牛高的牛的最小身高和所在位置j,这样j - i - 1就是第i个牛能够看到的牛头数 */ #include using namespace std; const int nMax = 80010; const int I原创 2012-08-10 09:49:52 · 523 阅读 · 0 评论 -
poj 3254---Corn Fields
/* 状态压缩+动态规划 题意:M*N的一块地,进行划分,要求划分后各区域不能有公共边,可以一块也不选择。题意我也不懂,根据后面所给的测试数据,才有了一些了解。 思路: 状态:d[i][s]表示第i行状态为s时所有的方案数。 状态转移:d[i][a]=sum(d[i-1][b]),a、b的关系为a中为1的位置b为0;a的判断有两个条件: ①与图进行匹配,图中为0的位置不能为1 ②两个1不能相连原创 2012-05-02 20:35:57 · 673 阅读 · 0 评论 -
POJ 1024 Tester Program
/* WA 主要思路: 首先DFS建立层次图。 然后判断,路径是否唯一,墙壁是否重复。 */ #include //#define TEST using namespace std; const int nMax = 105; const int mMax = 10100; int dis_s[nMax][nMax], dis_e[nMax][nMax]; char s[mMax]; stru原创 2012-08-02 11:07:00 · 778 阅读 · 0 评论 -
POJ 2774 Long Long Message(后缀数组)
/* 题意:输出两个字符串最大公共子串 题解:将两个字符串对接,中间使用一个从未出现过的字符相连,然后问题就可以使用后缀数组解决 */ #include using namespace std; const int nMax = 1000000; const int mMax = 0x7fff; char str[nMax]; int num[nMax]; int wa[nMax], wb[原创 2012-08-15 23:15:02 · 597 阅读 · 0 评论 -
POJ 1035 Spell checker(哈希表)
/* 题意:输入字典,然后输入单词,判断字典中是否出现过该单词,或者是否进行删除、添加、替换操作,如果是,则输出对应的字典中的单词 要求按照输入时候的排名输出 题解:建立两个哈希表。一个存储字典和输入字典中单词的排名,一个进行最后输出的判重 */ #include //#define using namespace std; const int HASH = 12007; char lis原创 2012-08-18 10:16:13 · 1068 阅读 · 0 评论 -
POJ 1743 Musical Theme(后缀数组,最长重复子串)
/* 题意:用数字代表音节,寻找最长主旋律,要求:不少于五个数字,不能重复;并不要求两段子串完全相同,相加同一个数字后相同也可以 题解:我原来把字符串相加一个数字后做了一次拼接,结果超时。其实这道题,更好的解法是,另建一个数组存储前后数据之差,这样如果, 存在主旋律,则这段字符串必然相等。然后问题就可以解决了。不过需要注意,最后结果需要加1 这道题做了很久,最后AC,收获很大,①到④是曾经出现原创 2012-08-20 22:29:48 · 589 阅读 · 0 评论 -
POJ 3740 Easy Finding(舞蹈链)
/* 舞蹈链模板题 */ #include #include const int mMax = 50, nMax = 500; int map[mMax][nMax]; int M, N; struct Node { int left, right, up, down; int col; }node[mMax * nMax];//双向链表 int len; int cnt[nMax];原创 2012-08-30 22:50:23 · 683 阅读 · 0 评论 -
POJ 1442 Black Box(堆实现)
/* 题意:ADD(a)表示向集合中增加元素a,get表示取出第k小元素,k根据get出现的次数不断变化,出现多少次取第几小数 题解:每次取第k小元素,k不断更新。使用两个堆,来完成。 小顶堆负责,选出最小的元素 大顶堆负责,选出k个元素中最大的元素,即第k小元素 */ #include using namespace std; const int nMax = 30010; int tre原创 2012-08-15 20:18:45 · 638 阅读 · 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 评论