2012年8月31日
摘要: HDU_2873 由于每次炸弹爆炸后剩下生成的炸弹都会往角上缩,因此如果把炸弹的状态看成一个节点的话实际上这是一个有向无环图的公平组合游戏,所以可以用SG函数的理论来求解。由于每个炸弹都是独立的,可以把每个炸弹的SG函数值通过记忆化搜索计算出来,然后异或到一起就是整个局面的SG函数值。#include<stdio.h>#include<string.h>#define MAXN 60#define MAXD 2510int N, M, sg[MAXN][MAXN];char b[MAXN];void prep(){ int i; memset(sg, -1, sizeo 阅读全文
posted @ 2012-08-31 22:28 Staginner 阅读(442) 评论(0) 推荐(0) 编辑
摘要: ZOJ_3209 精确覆盖问题,用Dancing Links直接求解即可。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 510#define MAXM 910#define MAXD 460010#define INF 0x3f3f3f3fint N, M, P, size, U[MAXD], D[MAXD], L[MAXD], R[MAXD], C[MAXD];int S[MAXM], H[MAXN], ANS, vis[MAXM];void prep(int n, i 阅读全文
posted @ 2012-08-31 17:55 Staginner 阅读(230) 评论(0) 推荐(0) 编辑
摘要: POJ_1084 对于任意一个正方形,我们都至少要拿掉其中的一个火柴,于是如果构造一个行表示火柴、列表示正方形的矩阵,如果第i根火柴属于第j个正方形,那么g[i][j]=1,否则g[i][j]=0。这样这个问题就转化成了选取尽量少的行,使得每列至少有一个1,于是就可以用Dancing Links解决了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 7710#define INF 0x3f3f3f3fint N, M, r[7][7], d[7][7], miss[70], 阅读全文
posted @ 2012-08-31 16:34 Staginner 阅读(730) 评论(2) 推荐(0) 编辑
摘要: UVALive_4318 与一般的在树上进行的选择往哪边走的游戏相比,这个题目不同之处在与每个点既可能成为自己的决策点,也可能成为对方的决策点,因此可以将每个点看成有两种状态,一种对应着博弈树中的max节点,另一种对应着博弈树中的min节点,然后从叶子节点开始向上dp,依次处理出每个节点在两种状态下的值。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 10010#define MAXM 1000010#define INF 0x3f3f3f3fint N, M, F, fi 阅读全文
posted @ 2012-08-31 15:09 Staginner 阅读(206) 评论(0) 推荐(0) 编辑
摘要: HDU_2295 第一次正式写Dancing Links解重复覆盖的问题,感觉和精确覆盖相比,精确覆盖要求每列只能有1一个1,因此在删除一列的时候要连带删除这一列中为1的所有行,同时要将选出的行中为1的列全部删除,而重复覆盖问题每列可以有多个1,但一旦选择了某一行,这一行上所有为1的列就可以纳入不考虑的范围了,因此删除操作就变成了删除某一行并删除这一行中为1的所有列。 此外,如果是裸的Dancing Links会超时,于是考虑剪枝。假设当前还能搜k步,那么随便挑一列,这列是一定要被覆盖的,而在覆盖这列的同时还最多能覆盖多少其他的列呢?不妨把这列为1的所有行合并看成1行,然后把它们能够覆盖到的列 阅读全文
posted @ 2012-08-31 10:53 Staginner 阅读(250) 评论(0) 推荐(0) 编辑