上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 85 下一页
  2012年9月20日
摘要: UVALive_4978 这个题目难点在于如何转化成数学模型,详细的转化思路还是看官方的题解吧:http://cepc10.ii.uni.wroc.pl/solutions.html。 完成数学模型的转化之后,问题就变成了给定了若干个8bit的二进制数,求选出若干个数且这些数或起来为11111111的方法数,这一点可以用容斥原理求解。 首先我们约定a[i]表示最终结果有且仅有i个bit为0的方案数,那么最后我们要求的就是a[0],再约定f[i]表示让结果的8个bit中任意i个bit为0而其他位不管的总方法数,这样f[0]就是2^N。在计算f[i]的时候,先枚举是哪i位为0,然后找到这i位为0的 阅读全文
posted @ 2012-09-20 18:22 Staginner 阅读(188) 评论(0) 推荐(0) 编辑
摘要: UVALive_4975 可以先用Manacher算法预处理出每个字符i处的回文半径Ri,也就是最大的Ri使得i-Ri~i+Ri-1构成回文串。 之后枚举每个字符i作为wwRwwR中后面这个的wwR的起始字符,然后在[i-Ri/2,i-1]的范围内找到最小的j使得j+Rj>=i,如果存在这样的j,那么就存在一个长度为4*(i-j)的wwRwwR式的回文串。#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define INF 0x3f3f3f3f#de 阅读全文
posted @ 2012-09-20 14:08 Staginner 阅读(326) 评论(0) 推荐(0) 编辑
  2012年9月19日
摘要: HDU_2878 这个题目说实话,感觉这个题的解题思想很好,但是题面的描述啊,&@!#¥&*@!*&!@#&*!@#……&*!@#*(¥@!)!!!!!!! 看这张图就知道我为啥要吐槽题目的描述了…… 首先,题目里面核心就两个元素——球球和三角形,而且不难发现球球的数量-2就是三角形的数量,如果我们把球球可以放的位置按一定顺序编码的话,就会发现对于一段连续的三角形就会得到一段连续的位置,于是问题就变成了一段标号连续的球可以放到一段标号连续的位置中去,问最后有多少中方案,这就像是在求最大匹配有多少个一样,但是貌似没有直接求最大匹配个数的算法,所以采用搜索来 阅读全文
posted @ 2012-09-19 09:43 Staginner 阅读(346) 评论(0) 推荐(0) 编辑
  2012年9月18日
摘要: HDU_4295 可以用f[i][j][k]表示递推到S的第i个字符时,选取的字符串的集合为k(用二进制表示),从当前字符开始向后已经覆盖了长度j的字符。 在这里不妨只讨论最小覆盖长度,最大覆盖长度类似。为了方便dp所以选用刷表的方式,首先令f[i][0][0]为0,接着对于任意一个f[i][j][k],实际上有两种决策,一种是当前这个位置什么也不放就过度到下一个字符,那么就有f[i+1][j-1][k]=std::min(f[i+1][j-1][k],f[i][j][k]),另一种就是从当前位置开始放上字符串t,这时要稍稍讨论一下,因为字符串t的长度可能会影响状态j,也就是从当前字符开始.. 阅读全文
posted @ 2012-09-18 21:57 Staginner 阅读(328) 评论(0) 推荐(0) 编辑
  2012年9月17日
摘要: UVA_10572 由于具有连通性的要求,所以可以用插头dp来处理,这样需要记录下来轮廓线上格子的颜色以及连通状况,在dp的时候需要考虑全面不合法的情况,具体的思路可以参考另一个题的题解:http://www.cnblogs.com/staginner/archive/2012/09/17/2688634.html。 在最坏的情况下即8*8全部是'.',递推到每个格子的状态总数也没超过10000。#include<stdio.h>#include<string.h>#include<algorithm>#define HASH 10007#d 阅读全文
posted @ 2012-09-17 15:47 Staginner 阅读(682) 评论(0) 推荐(0) 编辑
摘要: HDU_3633 这个题目确实比较复杂,具体的思路还是参考胡浩的解题报告吧:View Code // My code#include<stdio.h>#include<string.h>#include<algorithm>#define HASH 100007#define MAXD 100010#define INF 0x3f3f3f3fint N, M, pre[65][MAXD], a[10][10];char op[65][MAXD], g[10][10];struct HashMap{ int head[HASH], size, next[MAX 阅读全文
posted @ 2012-09-17 13:58 Staginner 阅读(476) 评论(0) 推荐(0) 编辑
  2012年9月14日
摘要: POJ_3133 这个题目可以用插头dp处理,在dp的过程中可以将2、3相连的连通分量置为特定的数,其他的处理方式和普通的插头dp类似,只不过由于多了两类独立插头要多讨论一些情况。#include<stdio.h>#include<string.h>#include<algorithm>#define HASH 41941 #define SIZE 100010#define MAXN 15struct HashMap{ int head[HASH], size, next[SIZE], st[SIZE], f[SIZE]; void init() { me 阅读全文
posted @ 2012-09-14 19:25 Staginner 阅读(448) 评论(0) 推荐(0) 编辑
摘要: ZOJ_3256 这个题目在我最早学插头dp的时候就开始折磨我了,当时没能拿下这个题,主要是当时有两点没弄懂:①对于表示一个图的邻接矩阵的n次方,其中(i,j)位置的元素表示点i经n步到达点j的方案数;②一开始学插头dp就都是逐格进行dp的,而这个要先逐列dp,待拓展出所有可能的列的状态后再进行矩阵乘法,所以顿时不知道怎么做了。 其实在逐列dp的时候可以先2^n枚举出当前列中每个位置有无右插头,同时再考虑上左边前一列右插头的状态(这里的状态是指:有无插头,以及是哪个连通块的插头),然后自上向下扫一遍,由于相邻的两个插头(两个插头可能都是前一列的,可能都是当前列的,也可能各一个)必然要形成通路( 阅读全文
posted @ 2012-09-14 12:19 Staginner 阅读(470) 评论(0) 推荐(0) 编辑
  2012年9月11日
摘要: SPOJ_7258 SUBLEX 这个题目可以先用O(N)的时间构造出后缀自动机,由于后缀自动机中每条路径都对应着一个不重复的子串,因此可以用dp处理出到达一个节点以及其后面的节点的路径数,然后每次查询时遍历一遍后缀自动机就可以了。 但这样总的查询复杂度是O(N*Q)的,如果不用各种常数优化的话很容易TLE。#include<stdio.h>#include<string.h>#define MAXD 90010struct SufAuto{ int pre, next[26], len;}sa[2 * MAXD];namespace SA{ int node, tai 阅读全文
posted @ 2012-09-11 16:04 Staginner 阅读(587) 评论(0) 推荐(0) 编辑
  2012年9月8日
摘要: HDU_4267 根据k的值建立10类树状数组,每类中根据i%k的不同建立k棵树状数组,也就是55棵树状数组,这样每次修改操作只对其中1棵树状数组进行操作,所以是O(logN)的复杂度,每次查询只对其中10棵树状数组统计增量和,所以是O(10*logN)的复杂度。#include<stdio.h>#include<string.h>#define MAXD 50010int N, M, d[100][MAXD], a[MAXD];void insert(int k, int x, int v){ for(; x <= N; x += x & -x) d[k 阅读全文
posted @ 2012-09-08 21:33 Staginner 阅读(1480) 评论(0) 推荐(0) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 10 11 ··· 85 下一页