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 · 733 阅读 · 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 · 803 阅读 · 0 评论 -
POJ 2528 Mayor's posters(离散化+线段树)
/*这道题,真的做了很久,终于AC。①原来使用哈希判重,结果超时,其实一次历遍就行②在search()函数中,需要考虑查找成功和失败两种情况,失败情况容易忽略③其实对于“区间更新”问题,算法不存在错误,可以作为模版。至于A[l] ++ , A[r + 1] --,这个只能处理求和问题,实际对效率无太大影响,只是多一个log(n)④离散化处理的第一道问题,两重for()循环即可,一个判重原创 2012-09-03 19:19:38 · 1103 阅读 · 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 · 822 阅读 · 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 · 645 阅读 · 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 · 1275 阅读 · 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 · 629 阅读 · 0 评论 -
POJ 2486 Apple Tree(树形DP + 01背包)
/*树形DP + 01背包思路:首先bfs将图转变为树,然后dfs进行动态规划。有两种状态,其中d[0][i][j]表示直通,d[1][i][j]表示返回到i节点①、②处,曾经出错临界状态的初始化,始终感觉是个难点,一直没有搞清楚。最后在测试数据1 11的时候发现问题。*/#include #include const int nMax = 107;const int mM原创 2012-09-08 21:24:50 · 615 阅读 · 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 · 982 阅读 · 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 · 681 阅读 · 0 评论 -
POJ 2823 Sliding Window(单调队列)
/*单调队列适合解决的问题,多次查询k个连续序列中最大或最小值。可以将复杂度从O(n*n)缩短到O(n)。实现模式:队列实现,只不过其中元素单调(依次增大或减小),我们假设求最大值。入队时比较队尾元素与插入元素的大小,如果队尾元素小与插入元素,则对尾元素出对,直到大于等于位置。这样插入k个元素后,队列中队首即为最大值。继续进行第二次查询时,需要比较队首元素在原来元素中的位置,判断是否在这次原创 2012-08-09 11:29:44 · 487 阅读 · 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 · 546 阅读 · 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 · 718 阅读 · 0 评论 -
POJ 1024 Tester Program
/*WA主要思路:首先DFS建立层次图。然后判断,路径是否唯一,墙壁是否重复。*/#include //#define TESTusing 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 · 800 阅读 · 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 · 616 阅读 · 0 评论 -
POJ 1035 Spell checker(哈希表)
/*题意:输入字典,然后输入单词,判断字典中是否出现过该单词,或者是否进行删除、添加、替换操作,如果是,则输出对应的字典中的单词要求按照输入时候的排名输出题解:建立两个哈希表。一个存储字典和输入字典中单词的排名,一个进行最后输出的判重*/#include //#define using namespace std;const int HASH = 12007;char lis原创 2012-08-18 10:16:13 · 1085 阅读 · 0 评论 -
POJ 1743 Musical Theme(后缀数组,最长重复子串)
/*题意:用数字代表音节,寻找最长主旋律,要求:不少于五个数字,不能重复;并不要求两段子串完全相同,相加同一个数字后相同也可以题解:我原来把字符串相加一个数字后做了一次拼接,结果超时。其实这道题,更好的解法是,另建一个数组存储前后数据之差,这样如果,存在主旋律,则这段字符串必然相等。然后问题就可以解决了。不过需要注意,最后结果需要加1这道题做了很久,最后AC,收获很大,①到④是曾经出现原创 2012-08-20 22:29:48 · 606 阅读 · 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 · 706 阅读 · 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 · 658 阅读 · 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 · 551 阅读 · 0 评论