上一页 1 ··· 9 10 11 12 13 14 15 下一页
摘要: 树形背包的变形,要特殊考虑当用一个机器人遍历一棵子树的情况。 /*d[i][k]表示节点i用k个机器人探索的最小花费跟树型背包问题差不多d[u][k]=d[u][k-i]+d[v][i]+i*w表示给当前已遍历的子树以及父节点k-i个机器人,给当前正在遍历子树i个机器人注意也可以把k个机器人全部给已遍历子树,d[v][0]实际上相当于用一个机器人遍历完再走到父节点所以这种情况下d[u][k]=d[u][k]+d[v][0]+2*w*/#include <stdio.h>#include <string.h>#define MAXN 10005#define MAXK 1 阅读全文
posted @ 2012-08-27 21:09 Burn_E 阅读(139) 评论(0) 推荐(0)
摘要: 问小于n的数里n/phi(n)最大的数是多少。 由欧拉函数的性质可得n/phi(n)=n/(n*(1-1/p1)*(1-1/p2)...*(1-1/pn))=1/((1-1/p1)*(1-1/p2)...*(1-1/pn)),其中p1~pn为n的质因数。 可见n的质因数越多,n/phi(n)的值越大,所以令n为连续素数的乘积即可。 #include <string.h>#include <stdio.h>struct bign{ int s[205],len; bign(){memset(s,0,sizeof s);len=1;} bign(char *str){*.. 阅读全文
posted @ 2012-08-27 21:06 Burn_E 阅读(145) 评论(0) 推荐(0)
摘要: 简单的类LIS问题,按长和宽排序然后DP。注意两个问题即可,一是要规定长的边为长,短边为宽,二是排序时要将要求较少的块放在后面。 #include <stdio.h>#include <string.h>#include <algorithm>#define MAXN 1005typedef __int64 LL;struct block{ int ai,bi,ci,di; bool operator <(const block& b)const{ if(ai!=b.ai)return ai<b.ai; if(bi!=b.bi)retur 阅读全文
posted @ 2012-08-27 20:51 Burn_E 阅读(170) 评论(0) 推荐(0)
摘要: 比较恶心的一道题,主要在数位DP那里调试了好久。 题目大意:0~9可以用对应的BCD码表示,给出A~B之间的十进制数,将他们化成BCD码的形式。但有些01串是不能出现的,求能化成BCD码的数的个数。 先建图,然后将二进制转十进制,比如next[p][7]=next[p][0]->[1]->[1]->[1],如果后面这条路能走出来next[p][7]就存在,否则为-1。之后数位DP,求能走出的比X的小的数有多少种,这里要注意细节,很容易写错。求出后DP(B)-DP(A)就行了。 1 #include <stdio.h> 2 #include <string.h 阅读全文
posted @ 2012-08-13 23:32 Burn_E 阅读(279) 评论(1) 推荐(0)
摘要: 一道纠结了好久的题,主要是因为一开始思路就想错了,还按着错误的思路想了好久。。。 题目大意就是要找一个最短的字符串,包含所有的合法单词并且不包含所有的非法单词。 题目中给的非法单词非常多,但是合法单词很少,很容易想到用状态压缩来做。我一开始想到的是把每个合法单词当作一个点,然后用哈密顿回路来做,想了半天才发现这个思路明显是错误的。。。。。。 正确的做法是把所有可以作为合法单词结尾的点选出来,BFS出每两点之间的距离,每个点都会有一个压缩状态标记这个点可以作为哪几个单词的结尾,然后DP就可以了。 d[state][v]表示最后一步在v时到达state这个状态需要的最小长度,方程为d[... 阅读全文
posted @ 2012-08-12 02:20 Burn_E 阅读(534) 评论(0) 推荐(0)
摘要: 题意是说给你若干个单词,每个单词有一定的分数。如果一个字符串包含了某个单词就会得到该单词的分数,并且可以重复计算。让你输出一个长度不大于N并且分数最大的字符串,分数相等时选最短的,长度相等时选字典序最小的。 DP方程很容易想,就是最普通的自动机DP。麻烦的地方在于保证字典序,如果从上向下DP,要保存前缀,比较字典序每次要从开头开始比较,可以写出来但是比较麻烦。我是将模式串反过来建图的,这样等于从后向前生成字符串,分数相同时每次选择较小的字符就一定能生成字典序最小的字符串,但要注意当两字符相等时要向前比较直到可以分出字典序为止。 代码交上去跑了15ms,看statistic已经排在第五了... 阅读全文
posted @ 2012-08-08 00:26 Burn_E 阅读(511) 评论(2) 推荐(0)
摘要: 还是统计串问题,只是分成了同一种串允许互相覆盖和不允许互相覆盖两种情况。 对于允许互相覆盖的情况,就是模版了。对于不允许覆盖的情况,只要记录下该串最后一次出现并且被统计的位置即可,能统计的条件是lasp[id]+len[id]<=pos。#include <string.h>#include <stdio.h>#define MAXL 600001#define MAXN 100001#define INF 0x3fffffffchar s[MAXN],s1[10];int n,type,stp[MAXN],sps[MAXN];int next[MAXL][26] 阅读全文
posted @ 2012-08-07 17:07 Burn_E 阅读(240) 评论(0) 推荐(0)
摘要: 给出一个DNA串以及若干个带有疾病的串,问至少要改变DNA串中的几个字符,才能让它不携带病毒串。其实还是不包含若干子串的问题,可以转化为走一条不包含病毒串的路径,这条路径组成的串和给出DNA串最少相差几个字符,这样就很容易想到DP方程 d[i][j]一开始初始化为无穷大,x是j的父亲节点,也就是说存在next[x][p]=j,一般都是从前向后刷表的。flag表示这一位和DNA串中的对应字符是否相等,相等时为0,不相等时为1。 注意在走的过程中不要走到危险节点上去。#include <string.h>#include <stdio.h>#define MAXN 1001 阅读全文
posted @ 2012-08-07 15:38 Burn_E 阅读(296) 评论(0) 推荐(0)
摘要: 给出M个单词,问长度为N的包含不少于K个单词的字符串一共有多少个。到目前为止做的自动机的题目好像都是差不多样子。。都是包含不包含单词之类的。。 这题用d[i][j][k]表示第i步走到字符j包含了单词集合k,因为一共只有10个单词,可以用二进制压缩状态表示这个集合。注意在建立trie图时要合并节点和它的fail节点的状态,一开始没想到这个WA了一次。状态转移方程为 不加优化的代码交上去时间接近TLE。。。于是改成了滚动数组,并用for循环清0,还是要跑360ms左右。这相对于1s的时限还是很慢的。。。于是点了下Statistic,发现大家都是跑了好几百ms。。。。#include ... 阅读全文
posted @ 2012-08-07 13:15 Burn_E 阅读(202) 评论(0) 推荐(0)
摘要: 应该算是最基础的AC自动机DP了吧。。 跟前面做的两道用矩阵加速的AC自动机题目意思差不多,都是求不包含给定单词的单词数。区别就是给定单词较多,需要的字符串比较短,然后结果不取模,要用到高精度。 trie图中大约有50*10个节点,如果建立矩阵用矩阵加速无论是时间复杂度还是空间复杂度都是会超的(时间大约是500^3*log(50),空间是500^2*高精度数组)。所以这里要用到DP了,用dp[i][j]表示第i步在第j个节点的方法数。flag[k]=0表示不是非法节点,son是k的儿子节点的集合。 一开始爆空间了,POJ真心抠啊,这题就给了10M内存,后来高精度里面用char存,... 阅读全文
posted @ 2012-08-07 10:26 Burn_E 阅读(254) 评论(0) 推荐(0)
上一页 1 ··· 9 10 11 12 13 14 15 下一页