上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 85 下一页
  2012年8月31日
摘要: 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) 编辑
  2012年8月30日
摘要: HDU_3660 首先如果下一步到达某个节点后,无论怎么走都不能使路径和在L、R之内的话,那么是肯定不能走这一步的。至于如何找到这些不能走的节点,可以从叶子节点开始,如果这条路径和不在L、R之内,那么就将这个叶子标记为-1,表示不能来这个节点,对于其他的节点,如果它的所有孩子都被标记成了-1,那么它本身也应被标记-1。 这样我们只要沿不是-1的点走就可以了,接下来如何计算最大的可能值呢?对于Bob来讲,显然应该在所有的路中挑“最终可能得到的值最大”的那条路去走,而Alice就应该选择“最终可能得到的值最小”的那条路去走,那怎么才能知道最终可能的值是多少呢?只要从叶子节点开始向上依次计算就可以了 阅读全文
posted @ 2012-08-30 17:58 Staginner 阅读(448) 评论(0) 推荐(0) 编辑
摘要: HDU_1809 这个题目可以用SG函数求解。 由于对于任意一个棋盘来讲,如果将棋盘的状态看成一个节点,那么这个游戏就相当于是在一个有向无环图上行走。 而各个棋盘间是独立的,因此可以将每个棋盘的SG值先求出来,然后异或起来就得到了游戏整体的SG值。#include<stdio.h>#include<string.h>#define HASH 10007#define MAXD 10010#define MAXN 55typedef long long LL;int S, N, M, sg[MAXD], g[MAXN][MAXN];struct HashMap{ int 阅读全文
posted @ 2012-08-30 15:20 Staginner 阅读(298) 评论(0) 推荐(0) 编辑
摘要: HDU_2259 做这个题目首先要做Continuous Same Game(1),要不然不好测试对矩阵的操作是否是对的。 这个题目一开始怎么写怎么超时,如果改成用优先级队列的话就会爆空间,今天早晨才突然发现原来是对下面的这句话理解错了。 Then I will calculate the average of (Ai/Bi), 1<=i<=100. You will get WA if your ouput is invalid or this average is less than 1.5. 题目的意思是算100组case的Ai/Bi的平均值,并要求其不小于1.5,而我一开始 阅读全文
posted @ 2012-08-30 12:43 Staginner 阅读(307) 评论(1) 推荐(0) 编辑
  2012年8月29日
摘要: HDU_2258 本来是Step里面遇到了HDU_2259的,结果发现要先做这个题……模拟题目中所说的规则就可以了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 25#define MAXD 410int dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1}, L;int N, M, a[MAXN][MAXN];struct List{ int x, y;}list[MAXD];void init(){ int i, j; char b[M 阅读全文
posted @ 2012-08-29 20:02 Staginner 阅读(307) 评论(0) 推荐(0) 编辑
摘要: HDU_1560 一种可行的思路是迭代加深搜索,只要在不断增加递归深度限制时第一次出现生成了规定的字符串时,这个深度就是最优的深度了。 接下来就是考虑如何剪枝了,一种明显的思路就是记录当前每个字符串还差多少位补全,然后取最大的差距,如果剩下的可以构造的字符数小于最大的差距的话,那么就可以剪枝了。但这个剪枝还不够强,比如这个数据就会很慢8AAAAAGGGGGCCCCCTTTTTTTTAAAAATTCCGGGGGGCC,根据这个数据就会想到一个更好的剪枝,我们考虑至少还需要多少个A,至少还需要多少个T以及C、G,然后把4项之和作为前面所说的“最大的差距”,用这个作为剪枝的条件就比较快了,上面那.. 阅读全文
posted @ 2012-08-29 17:32 Staginner 阅读(587) 评论(0) 推荐(0) 编辑
摘要: HDU_1813 一种可行的思路是迭代加深搜索,在搜索的过程中按字典序依次选择四种操作,然后将所有的空格统一执行这个移动操作,如果最终所有空格都移到了边缘,那么就说明找到了最优的深度同时也找到了字典序最优的操作序列。 在搜索的时候可以加一个有效的剪枝:先bfs预处理出每个空格移到边缘所需的最少步数,这样如果在搜索过程中发现某个空格即便按最快的方案移动都不能在迭代加深限制的步数内到达边缘的话,就可以剪枝了。#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#de 阅读全文
posted @ 2012-08-29 16:26 Staginner 阅读(321) 评论(0) 推荐(0) 编辑
摘要: HDU_1667 如果我们确定要移动一类整数的话,那么其他两类整数实际上都可以看作是0,因此可以固定一个中间八个整数为1、其余整数为0的终态,然后预处理出所有可能的状态,在查询的时候只要枚举1、2、3分别作为要移动到中间整数就可以计算出最优解了。#include<stdio.h>#include<string.h>#define HASH 1000007#define MAXD 1000010#define INF 0x3f3f3f3fint op[][24] ={ {22, 1, 0, 3, 4, 5, 2, 7, 8, 9, 10, 6, 12, 13, 14, 1 阅读全文
posted @ 2012-08-29 00:37 Staginner 阅读(319) 评论(0) 推荐(0) 编辑
上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 85 下一页