摘要:
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], 阅读全文
摘要:
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 阅读全文
摘要:
HDU_2295 第一次正式写Dancing Links解重复覆盖的问题,感觉和精确覆盖相比,精确覆盖要求每列只能有1一个1,因此在删除一列的时候要连带删除这一列中为1的所有行,同时要将选出的行中为1的列全部删除,而重复覆盖问题每列可以有多个1,但一旦选择了某一行,这一行上所有为1的列就可以纳入不考虑的范围了,因此删除操作就变成了删除某一行并删除这一行中为1的所有列。 此外,如果是裸的Dancing Links会超时,于是考虑剪枝。假设当前还能搜k步,那么随便挑一列,这列是一定要被覆盖的,而在覆盖这列的同时还最多能覆盖多少其他的列呢?不妨把这列为1的所有行合并看成1行,然后把它们能够覆盖到的列 阅读全文