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) 编辑